在python中按频率排序列表

use*_*835 13 python indexing list frequency

有没有办法(在python中),我可以按频率对列表进行排序?

例如,

[1,2,3,4,3,3,3,6,7,1,1,9,3,2]
Run Code Online (Sandbox Code Playgroud)

上面的列表将按其值的频率顺序排序,以创建以下列表,其中频率最高的项目位于前面:

[3,3,3,3,3,1,1,1,2,2,4,6,7,9]
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 27

我认为这对于collections.Counter:

counts = collections.Counter(lst)
new_list = sorted(lst, key=lambda x: -counts[x])
Run Code Online (Sandbox Code Playgroud)

或者,您可以编写没有lambda的第二行:

counts = collections.Counter(lst)
new_list = sorted(lst, key=counts.get, reverse=True)
Run Code Online (Sandbox Code Playgroud)

如果您有多个具有相同频率的元素并且您关心那些仍然分组,我们可以通过更改排序键来不仅包括计数,还包括:

counts = collections.Counter(lst)
new_list = sorted(lst, key=lambda x: (counts[x], x), reverse=True)
Run Code Online (Sandbox Code Playgroud)


Pad*_*ham 5

l = [1,2,3,4,3,3,3,6,7,1,1,9,3,2]
print sorted(l,key=l.count,reverse=True)

[3, 3, 3, 3, 3, 1, 1, 1, 2, 2, 4, 6, 7, 9]
Run Code Online (Sandbox Code Playgroud)

  • 这样做的缺点是每次调用 `key` 都是 O(n),其中 `collections.Counter` 是 O(1),使用单个 O(n) 调用来构建 `Counter`(我没有反对,只是想指出效率差异)。 (10认同)