这是我的字典:
d['any1'] = 15
d['any2'] = 27
d['any3'] = 84
d['any4'] = 12
d['any5'] = 7
....
d['any1243'] = 24
有没有任何 python 工具可以帮助我在字典中找到 30 个最大的数字 1243?
谢谢。
最好使用 collections.Counter()
对象; Counter
使用 Counter.most_common()
方法明确支持此用例:
返回 n 个最常见元素的列表及其计数(从最常见到最少)。
from collections import Counter
counts = Counter(d)
for key, freq in counts.most_common(30):
print key, freq
您实际上会使用 Counter()
对象而不是 d
对象。 Counter
对象是一个dict
子类,因此在跟踪每个键的频率时,您可以将它们用作直接替换,尽管在许多情况下,它们使计数项目变得更加容易。
如果您坚持使用常规字典,那么您可以使用 heapq
模块(特别是 heapq.nlargest()
函数)自己实现此功能:
import heapq
from operator import itemgetter
thirty_largest = heapq.nlargest(30, d.iteritems(), key=itemgetter(1))
其中thirty_largest
是 30 个键值元组的列表:
>>> import heapq
>>> from operator import itemgetter
>>> import random
>>> d = {'any{}'.format(i): random.randrange(5000) for i in range(1243)}
>>> for key, value in heapq.nlargest(30, d.iteritems(), key=itemgetter(1)):
... print '{:<7} {:>4}'.format(key, value)
...
any1226 4997
any1150 4997
any1225 4993
any401 4992
any949 4988
any130 4978
any1069 4977
any96 4974
any955 4974
any229 4970
any1117 4966
any883 4964
any937 4961
any729 4958
any981 4958
any7 4952
any1045 4952
any600 4950
any134 4948
any16 4937
any312 4937
any1158 4937
any1238 4932
any315 4932
any875 4930
any339 4930
any295 4926
any878 4925
any343 4922
any681 4917
对于这么多值,您可以在几行中执行此操作,例如:
import operator
d = ...
s = sorted(d.iteritems(), key=operator.itemgetter(1), reverse=True)
print s[:30]