在Python中按重复排序列表

时间:2011-06-01 04:51:24

标签: python list sorting

我有一个包含多个重复项目的列表。我正在尝试通过提供重复次数最多的项目对列表进行排序。

所以它会变成这个

['a', 'b', 'c', 'a', 'b', 'a', 'd']

进入这个

['a', 'a', 'a', 'b', 'b', 'c', 'd']

4 个答案:

答案 0 :(得分:5)

d = {}
for a in l:
    d[a] += d.setdefault(a,0)

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

答案 1 :(得分: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']

答案 2 :(得分: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)), [])

答案 3 :(得分: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)]

虽然这是一个简单的解决方案,但请注意在使用大型列表时计算每个元素的复杂性。