Python字典中的5个最大值

74

我有一个如下的字典:

A = {'a':10, 'b':843, 'c': 39,.....}

我想获取这个字典中的前5个最大值,并将其存储到一个新的字典中。为了获取最大值,我做了以下操作:

max(A.iteritems(), key=operator.itemgetter(1))[0:]

也许这是一个简单的任务,但我已经卡在它上面很长时间了。请帮帮我!!!

5个回答

131

无需使用iteritems和itemgetter。字典自己的get方法就可以很好地工作。

max(A, key=A.get)

同样适用于排序:

sorted(A, key=A.get, reverse=True)[:5]

最后,如果字典大小是不受限制的,使用堆排序将比完全排序更快。

import heapq
heapq.nlargest(5, A, key=A.get)

如需了解更多信息,请查看heapq文档


如果有7个值相同,我怀疑它是否能正常工作,它仍然会返回5个值。 - tourist
谢谢,这很好。看起来选中的那个对于Python3.4不起作用。 - user1953366
它没有对我的值进行排序 :( - Aditi Singh

68

你已经很接近了。你可以使用sorted [docs]对列表进行排序,并选择前五个元素:

newA = dict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=True)[:5])

另请参阅:Python排序指南


5
对于大型字典,这种方法可能效率较低,但更高效的解决方案会更加复杂。(例如,可以实现一个部分快速排序,当高区有5个或更多元素时,不必对两个区域进行排序。)很可能对于提问者的目的来说,使用“sorted”技巧已经足够了。 - Keith Thompson
1
@keith-thompson 谢谢您的评论。但是,“大型”字典有多少个键呢?在我的字典中,我有大约2000个项目,这算大吗? - Alejandro
@Alejandro:如果排序会导致显著的性能问题,那么它就是“大型”的。对一个2000项列表(任何内容)进行排序将需要大约20,000次比较,但如果您的程序在您的手指离开回车键之前就产生了答案,那么优化可能不值得。而内置的sorted操作很可能已经通过一些手写的专用算法进行了优化,而我建议的这个算法可能无法实现。而且它已经经过了非常彻底的测试。 - Keith Thompson
@Alejandro:看看Coady的回答,我认为那个更好。 - Felix Kling
我认为你使用上述建议会比编写自定义代码更好,因为上述建议使用了内置的Python例程,这些例程可能已经被优化为C语言。这使得它的常数因子可能要好20倍。20 * n lg 5 > n lg 2000。对于1,000,000个项目,也许手写代码可以更快,但我仍然认为上面的解决方案是可接受的,而且不值得改进。 - morningstar

57

你可以在这里使用 collections.Counter

dict(Counter(A).most_common(5))

示例:

>>> from collections import Counter
>>> A = {'a' : 1, 'b' : 3, 'c' : 2, 'd' : 4, 'e' : 0, 'f' :5}
>>> dict(Counter(A).most_common(5))
{'a': 1, 'c': 2, 'b': 3, 'd': 4, 'f': 5}

2
这是唯一一个返回值和键的答案,谢谢。 - David Andrei Ned
谢谢!我们如何获得至少5个元素? - Onkar Musale

6

对于Python 3

import operator
dict(sorted(A.items(), key=operator.itemgetter(1), reverse=True)[:5])

关于:result = sorted(A.items(), key=lambda x: x[1], reverse=True)[:5],这句代码的意思是什么? - Alper Yilmaz

4

试试这个:

dict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=True)[:5])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接