我有一个整数列表;例如:
l = [1, 2, 3, 4, 4, 4, 1, 1, 1, 2]
我试图按照频率的降序列出l
中出现次数最多的三个元素。因此,在这种情况下,我想要列表[1, 4, 2]
,因为1
出现l
(四次),4
接下来有三个实例,然后是{{1}有两个。我只想要前三个结果,所以2
(只有一个实例)不会列出。
如何生成该列表?
答案 0 :(得分:19)
import collections
l= [1 ,2 ,3 ,4,4,4 , 1 ,1 ,1 ,2]
x=collections.Counter(l)
print(x.most_common())
# [(1, 4), (4, 3), (2, 2), (3, 1)]
print([elt for elt,count in x.most_common(3)])
# [1, 4, 2]
在Python 2.7中引入了 collections.Counter
。如果您使用的是旧版本,则可以使用the implementation here。
答案 1 :(得分:6)
l_items = set(l) # produce the items without duplicates
l_counts = [ (l.count(x), x) for x in set(l)]
# for every item create a tuple with the number of times the item appears and
# the item itself
l_counts.sort(reverse=True)
# sort the list of items, reversing is so that big items are first
l_result = [ y for x,y in l_counts ]
# get rid of the counts leaving just the items
答案 2 :(得分:2)
from collections import defaultdict
l= [1 ,2 ,3 ,4,4,4 , 1 , 1 ,1 ,2]
counter=defaultdict(int)
for item in l:
counter[item]+=1
inverted_dict = dict([[v,k] for k,v in counter.items()])
for count in sorted(inverted_dict.keys()):
print inverted_dict[count],count
这应打印出'l'中最常用的项目:您需要限制前三项。在那里使用inverted_dict时要小心(即键和值被交换):这将导致值的重写(如果两个项具有相同的计数,则只有一个将被写回到dict中)。
答案 3 :(得分:1)
不使用集合:
a = reversed(sorted(l,key=l.count))
outlist = []
for element in a:
if element not in outlist:
outlist.append(element)
第一行获取按计数排序的所有原始项目。
for循环对于在不丢失顺序的情况下进行统一是必要的(可能有更好的方法)。