2011-06-01 141 views

回答

5
>>> 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'] 
5
d = {} 
for a in l: 
    d[a] += d.setdefault(a,0) 

l.sort(key = lambda k: (d[k],k), reverse = True) 
+0

非常整齊的確! – Johnsyweb 2011-06-01 05:16:39

2
[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)), []) 
+0

哇,這是強大的 – GWW 2011-06-01 04:58:10

+2

不幸的總結列表有二次性能,所以應該避免 – 2011-06-01 05:37:24

1
l = ['a', 'b', 'c', 'a', 'b', 'a', 'd'] 
sorted_list = [item for item in sorted(l, key=lambda x: l.count(x), reverse=True)] 

雖然這是一個簡單的解決方案,介意使用大名單時,每一個元素計算的複雜性。

+0

對於一個大的列表調用不斷計數不會很有效 – GWW 2011-06-01 04:58:44

+0

確實,我也覺得有必要添加一個關於複雜性的評論。 – 2011-06-01 04:59:51

+3

爲什麼不只是'排序(l,key = lambda x:l.count(x),reverse = True)'? – Johnsyweb 2011-06-01 05:14:06

相關問題