毎日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"])) == ["a", "a", "b"]
    print decode(encode_modified(["a", "a", "b", "b"])) == ["a", "a", "b", "b"]
    print decode(encode_modified(["a", "a", "b", "b", "a"])) == ["a", "a", "b", "b", "a"]
    print decode(encode_modified(["a", "a", "a", "a", "b", "c", "c", "a", "a", "d", "e", "e", "e", "e"])) == ["a", "a", "a", "a", "b", "c", "c", "a", "a", "d", "e", "e", "e", "e"]

def decode(lista):
    return reduce(lambda x,y: x + [y[1] for i in range(y[0])] if isinstance(y, list) else x + [y], lista, []) if isinstance(lista, list) else None

def encode_modified(lista):
    pack_l = pack(lista)
    return [[len(v), v[0]] if len(v) > 1 else 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()