毎日Learning

学んだことを共有します

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, "a"], [2, "b"]]
    print encode(["a", "a", "b", "b", "a"]) == [[2, "a"], [2, "b"], [1, "a"]]
    print encode(["a", "a", "a", "a", "b", "c", "c", "a", "a", "d", "e", "e", "e", "e"]) == [[4, "a"], [1, "b"], [2, "c"], [2, "a"], [1, "d"], [4, "e"]]

def encode(lista):
    pack_l = pack(lista)
    return [[len(v), v[0]] for v in pack_l] if pack_l else pack_l

def pack(lista):
    return reduce(appender2pack, lista, []) if isinstance(lista, list) else None

def appender2pack(l, v):
    if l:
        if v in l[-1]:
            l[-1].append(v)
        else:
            l.append([v])
    else:
        l.append([v])
    return l

if __name__ == "__main__":
    main()