我有一個包含多個重複項目的列表。我試圖通過給出重複次數最多的項目對列表進行排序。通過Python中的重複對列表進行排序
因此,這將關閉此
['a', 'b', 'c', 'a', 'b', 'a', 'd']
這個
['a', 'a', 'a', 'b', 'b', 'c', 'd']
我有一個包含多個重複項目的列表。我試圖通過給出重複次數最多的項目對列表進行排序。通過Python中的重複對列表進行排序
因此,這將關閉此
['a', 'b', 'c', 'a', 'b', 'a', 'd']
這個
['a', 'a', 'a', 'b', 'b', 'c', 'd']
>>> from collections import Counter
>>> [k for k,v in Counter(['a', 'b', 'c', 'a', 'b', 'a', 'd']).most_common() for i in xrange(v)]
['a', 'a', 'a', 'b', 'b', 'c', 'd']
這可能是更容易跟蹤
>>> counter = Counter(['a', 'b', 'c', 'a', 'b', 'a', 'd'])
>>> sorted(counter.elements(), key=counter.get, reverse=True)
['a', 'a', 'a', 'b', 'b', 'c', 'd']
d = {}
for a in l:
d[a] += d.setdefault(a,0)
l.sort(key = lambda k: (d[k],k), reverse = True)
[v for (v, c) in sorted(((x, list(y)) for (x, y) in
itertools.groupby(sorted(['a', 'b', 'c', 'a', 'b', 'a', 'd']))),
key=lambda x: len(x[1]), reverse=True) for z in c]
編輯:
現在用sum()
!
sum((c for (v, c) in sorted(((x, list(y)) for (x, y) in
itertools.groupby(sorted(['a', 'b', 'c', 'a', 'b', 'a', 'd']))),
key=lambda x: len(x[1]), reverse=True)), [])
哇,這是強大的 – GWW 2011-06-01 04:58:10
不幸的總結列表有二次性能,所以應該避免 – 2011-06-01 05:37:24
l = ['a', 'b', 'c', 'a', 'b', 'a', 'd']
sorted_list = [item for item in sorted(l, key=lambda x: l.count(x), reverse=True)]
雖然這是一個簡單的解決方案,介意使用大名單時,每一個元素計算的複雜性。
非常整齊的確! – Johnsyweb 2011-06-01 05:16:39