毎日Learning

学んだことを共有します

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__ == "__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"]]