あなたが見たいですcollections.Counter()
; Counter
オブジェクトはマルチセット (バッグとも呼ばれます) です。キーをカウントにマップします。
ただし、キーとして使用できるようにするには、サブリストをタプルに変換する必要があります。
from collections import Counter
counts = Counter(tuple(e) for e in list_1)
new_list = [list(e) + [count] for e, count in counts.most_common()]
これによりnew_list
、カウント(降順)でソートされます:
>>> from collections import Counter
>>> list_1 = [['a', 'b'], ['a', 'c'], ['a', 'c'], ['a', 'c'], ['b', 'e'], ['d', 'q'], ['d', 'q']]
>>> counts = Counter(tuple(e) for e in list_1)
>>> [list(e) + [count] for e, count in counts.most_common()]
[['a', 'c', 3], ['d', 'q', 2], ['a', 'b', 1], ['b', 'e', 1]]
発生が常に連続している場合は、次を使用することもできますitertools.groupby()
。
from itertools import groupby
def counted_groups(it):
for entry, group in groupby(it, key=lambda x: x):
yield entry + [sum(1 for _ in group)]
new_list = [entry for entry in counted_groups(list_1)]
ここでは別のジェネレーター関数を使用しましたが、ループをリスト内包表記にインライン化できます。
これは与える:
>>> from itertools import groupby
>>> def counted_groups(it):
... for entry, group in groupby(it, key=lambda x: x):
... yield entry + [sum(1 for _ in group)]
...
>>> [entry for entry in counted_groups(list_1)]
[['a', 'b', 1], ['a', 'c', 3], ['b', 'e', 1], ['d', 'q', 2]]
元の順序を保持します。