按频率排序列表
在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)