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__ == "__main__": print encode_direct("a") == None print encode_direct([]) == [] print encode_direct(["a"]) == ["a"] print encode_direct(["a", "b"]) == ["a", "b"] print encode_direct(["a", "a", "b"]) == [[2, "a"], "b"] print encode_direct(["a", "a", "b", "b"]) == [[2, "a"], [2, "b"]] print encode_direct(["a", "a", "b", "b", "a"]) == [[2, "a"], [2, "b"], "a"] print encode_direct(["a", "a", "a", "a", "b", "c", "c", "a", "a", "d", "e", "e", "e", "e"]) == [[4, "a"], "b", [2, "c"], [2, "a"], "d", [4, "e"]]