按频率排序列表

24 投票
8 回答
48914 浏览
提问于 2025-04-21 09:14

在Python中,有没有办法按照列表中元素出现的频率来排序呢?

比如说,

[1,2,3,4,3,3,3,6,7,1,1,9,3,2]

上面的列表会按照元素出现的次数进行排序,生成一个新的列表,其中出现次数最多的元素会放在最前面:

[3,3,3,3,3,1,1,1,2,2,4,6,7,9]

8 个回答

1

我在练习这个,觉得挺有意思的。这个解决方案用的时间复杂度更低。

from collections import defaultdict

lis = [1,2,3,4,3,3,3,6,7,1,1,9,3,2]

dic = defaultdict(int)
for num in lis:
    dic[num] += 1

s_list = sorted(dic, key=dic.__getitem__, reverse=True)

new_list = []
for num in s_list:
    for rep in range(dic[num]):
        new_list.append(num)

print(new_list)
2

如果你想使用一个双重比较器的话。

举个例子:把列表按出现频率从高到低排序,如果出现频率相同,就把较小的放在前面。

import collections 

def frequency_sort(a):
    f = collections.Counter(a)
    a.sort(key = lambda x:(-f[x], x))
    return a
2

你可以使用一个 Counter 来统计每个项目的数量,然后用它的 most_common 方法来按数量排序,最后再用列表推导式来展开结果。

>>> lst = [1,2,3,4,3,3,3,6,7,1,1,9,3,2]
>>> 
>>> from collections import Counter
>>> [n for n,count in Counter(lst).most_common() for i in range(count)]
[3, 3, 3, 3, 3, 1, 1, 1, 2, 2, 4, 6, 7, 9]
6

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,程序就要做出反应。这种情况我们通常会用“事件”来处理。

事件就像是一个信号,告诉程序某件事情发生了。比如,用户点击了按钮、移动了鼠标或者输入了文字,这些都是事件。程序需要“监听”这些事件,才能在它们发生时做出相应的反应。

为了让程序能够处理这些事件,我们通常会使用一些特定的代码来设置这些监听器。监听器就像是一个守卫,时刻关注着事件的发生。一旦有事件发生,监听器就会触发相应的代码,让程序执行特定的操作。

总之,事件和监听器是让程序与用户互动的重要工具。通过它们,程序能够根据用户的操作做出反应,从而提供更好的用户体验。

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]
40

我觉得这个任务可以用一个叫做 collections.Counter 的工具来完成:

counts = collections.Counter(lst)
new_list = sorted(lst, key=lambda x: -counts[x])

另外,你也可以不使用 lambda 来写第二行代码:

counts = collections.Counter(lst)
new_list = sorted(lst, key=counts.get, reverse=True)

如果你有多个元素的出现频率是一样的,并且你希望这些元素保持在一起,我们可以通过改变排序的方式来做到这一点,不仅考虑出现的次数,还要考虑它们的

counts = collections.Counter(lst)
new_list = sorted(lst, key=lambda x: (counts[x], x), reverse=True)

撰写回答