リスト内の連続した重複を識別する最も Python 的な方法は何ですか? 質問する

リスト内の連続した重複を識別する最も Python 的な方法は何ですか? 質問する

整数のリストがあり、重複の連続ブロックを識別できるようにしたいと考えています。つまり、各重複に (int_in_question、出現回数) が含まれる順序が保持された重複リストを生成したいと考えています。

たとえば、次のようなリストがあるとします。

[0, 0, 0, 3, 3, 2, 5, 2, 6, 6]

次のような結果を望んでいます:

[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)]

私はかなりfor ループ、temp、カウンターを使用してこれを行う簡単な方法:

result_list = []
current = source_list[0]
count = 0
for value in source_list:
    if value == current:
        count += 1
    else:
        result_list.append((current, count))
        current = value
        count = 1
result_list.append((current, count))

しかし、私は Python の関数型プログラミングのイディオムがとても気に入っており、これを単純なジェネレータ式で実現できるようにしたいと考えています。ただし、ジェネレータを使用する場合、サブカウントを維持するのが難しいと感じています。2 段階のプロセスで実現できるのではないかと思いますが、今のところは行き詰まっています。

特にジェネレータを使用して、これを実行するための特にエレガントで Python 的な方法はありますか?

ベストアンサー1

>>> from itertools import groupby
>>> L = [0, 0, 0, 3, 3, 2, 5, 2, 6, 6]
>>> grouped_L = [(k, sum(1 for i in g)) for k,g in groupby(L)]
>>> # Or (k, len(list(g))), but that creates an intermediate list
>>> grouped_L
[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)]

電池付属、 彼らが言うように。

sumJBernardo からのジェネレータ式の使用に関する提案。コメントを参照してください。

おすすめ記事