你想看看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]]
,並保留原始排序。
你能闡述'[A,C,3],[A,C ,1]'? – NPE 2013-03-02 16:33:27
此外,'list_1'的相同元素保證連續? – NPE 2013-03-02 16:34:19
這些必須是list()或者tuple()嗎? – 2013-03-02 16:37:15