这是我的字典:
d['any1'] = 15
d['any2'] = 27
d['any3'] = 84
d['any4'] = 12
d['any5'] = 7
....
d['any1243'] = 24
是否有任何 python 工具可以帮助我从字典中的 1243 中找到 30 个最大的数字?
谢谢。
这是我的字典:
d['any1'] = 15
d['any2'] = 27
d['any3'] = 84
d['any4'] = 12
d['any5'] = 7
....
d['any1243'] = 24
是否有任何 python 工具可以帮助我从字典中的 1243 中找到 30 个最大的数字?
谢谢。
你最好使用一个collections.Counter()
对象;s 使用以下方法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]