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()