毎日Learning

学んだことを共有します

L-99

P20 (*)リストからK番目の要素を削除する。

def remove_at(l, num): return [v for i,v in enumerate(l) if (i+1) != num] if isinstance(l, list) else None if __name__ == "__main__": print remove_at("a", 3) == None print remove_at(["a"], -1) == ["a"] print remove_at(["a"], 0) == ["a"] pr…

P19 (**)リスト要素をN要素分左に移動させる。

def rotate(l, num): return l[num:] + l[:num] if isinstance(l, list) else None if __name__ == "__main__": print rotate("a", 3) == None print rotate(["a"], -1) == ["a"] print rotate(["a"], 0) == ["a"] print rotate(["a"], 1) == ["a"] print ro…

P18 (**)リストをスライスして要素を抽出する。

def slicer(l, start, end): if not isinstance(l, list) or not start or not end or start > end or start > len(l) or end > len(l): return None return l[start-1:end] if __name__ == "__main__": print slicer("a", 3, 5) == None print slicer(["a"]…

P17 (*)リストを2つに分割する。1つ目の要素の長さは指定される。

def split_list(l, num): return [l[:num], l[num:]] if isinstance(l, list) else None if __name__ == "__main__": print split_list("a", 3) == None print split_list([], 0) == [[], []] print split_list(["a"], -1) == [[], ['a']] print split_list(…

P16 (**)リストのNの倍数番目の要素を削除する。リストの最初の要素を1番目として数える。

def drop(lista, num): return [v for i,v in enumerate(lista) if (i+1)%num != 0] if 0 < num else None if __name__ == "__main__": print drop([], 0) == None print drop(["a"], 0) == None print drop(["a"], 1) == [] print drop(["a"], 2) == ["a"] …

P15 (**)リストの各要素を指定回数連続させる。

def repli(lista, num): return reduce(lambda l,v: l+[v for i in range(num)], lista, []) if isinstance(lista, list) else None if __name__ == "__main__": print repli("a", 3) == None print repli([], 0) == [] print repli(["a"], 0) == [] print r…

P14 (*) リストの各要素を2連続させる。

def dupli(lista): return reduce(lambda x,y: x+[y,y], lista, []) if isinstance(lista, list) else None if __name__ == "__main__": print dupli("a") == None print dupli([]) == [] print dupli(["a"]) == ["a", "a"] print dupli(["a", "b"]) == ["a"…

P13 (**) リストをランレングス圧縮(直接型)

def encode_direct(lista): def padd(p, v): if not p or not v in p[-1]: p.append(v) else: if isinstance(p[-1], list): p[-1][0] += 1 else: p[-1] = [2, v] return p return reduce(padd, lista, []) if isinstance(lista, list) else None if __name__…

L-99: Ninety-Nine Lisp Problems p13-p20 までのソースをさらす

L-99: Ninety-Nine Lisp Problems p11-p12 までのソースをさらす - 毎日Learning の続き。今回はししょーに、「簡潔なコードを書くことにこだわりすぎず、分かりやすいコードを書くようにせよ」との命題を受けた。が、受ける前に書いているコードもいくつか…

P12 (**) P11の解でランレングス圧縮されたリストを解凍して元に戻す。

def main(): print decode(encode_modified("a")) == None print decode(encode_modified([])) == [] print decode(encode_modified(["a"])) == ["a"] print decode(encode_modified(["a", "b"])) == ["a", "b"] print decode(encode_modified(["a", "a", "b…

P11 (*) ランレングス圧縮の改良版。

def main(): print encode_modified("a") == None print encode_modified([]) == [] print encode_modified(["a"]) == ["a"] print encode_modified(["a", "b"]) == ["a", "b"] print encode_modified(["a", "a", "b"]) == [[2, "a"], "b"] print encode_mod…

P10 (*) リストをランレングス圧縮する。

def main(): print encode("a") == None print encode([]) == [] print encode(["a"]) == [[1, "a"]] print encode(["a", "b"]) == [[1, "a"], [1, "b"]] print encode(["a", "a", "b"]) == [[2, "a"], [1, "b"]] print encode(["a", "a", "b", "b"]) == [[2…

P09 (**) リストの重複する要素をそれぞれ子リストとしてまとめる。

def main(): print pack("a") == None print pack([]) == [] print pack(["a"]) == [["a"]] print pack(["a", "b"]) == [["a"], ["b"]] print pack(["a", "a", "b"]) == [["a", "a"], ["b"]] print pack(["a", "a", "b", "b"]) == [["a","a"], ["b", "b"]] p…