我有一个按值排序的有序字典(OrderedDict
)。如何获得顶部(比如说25个)键值并将它们添加到新词典中?
例如:我有这样的事情:
dictionary={'a':10,'b':20,'c':30,'d':5}
ordered=OrderedDict(sorted(dictionary.items(), key=lambda x: x[1],reverse=True))
现在ordered
是一个有序的字典,我想创建一个字典,比如通过获取前2个最频繁的项目及其键:
frequent={'c':30,'b':20}
答案 0 :(得分:15)
collections.OrderedDict
的主要目的是保留元素插入的顺序。
你想要的是collections.Counter
,它内置了n个最常用的功能:
>>> dictionary={'a':10,'b':20,'c':30,'d':5}
>>> import collections
>>> collections.Counter(dictionary).most_common(2)
[('c', 30), ('b', 20)]
答案 1 :(得分:5)
使用您已经拥有的(反向)有序词典中的前N个项目(密钥对)创建一个新词典。例如,要获得前三项,您可以执行以下操作:
from collections import OrderedDict
from operator import itemgetter
# create dictionary you have
dictionary = {'a': 10, 'b': 20, 'c': 30, 'd': 5}
ordered = OrderedDict(sorted(dictionary.items(), key=itemgetter(1), reverse=True))
topthree = dict(ordered.items()[:3])
print(topthree) # -> {'a': 10, 'c': 30, 'b': 20}
对于Python 3,可以使用dict(list(ordered.items())[:3])
,因为items()
返回该版本中的迭代器。或者,您可以使用dict(itertools.islice(ordered.items(), 3))
,它可以在Python 2和3中使用。
另请注意,结果只是一个常规字典 - 正如您在问题中指定的那样 - 不是collections.Counter
或其他类型的映射。这种方法非常通用,并且不要求原始dictionary
具有整数值 - 只需对事物进行排序(即通过key
函数进行比较)。
答案 2 :(得分:2)
您是否尝试将已排序的元组列表编入索引以获取前n个最常用的项目及其密钥? 例如,如果您需要前2个最常用的项目,则可以执行
dictionary={'a':10,'b':20,'c':30,'d':5}
ordered=dict(sorted(dictionary.items(), key=lambda x: x[1],reverse=True)[:2])
答案 3 :(得分:1)
从ordered.iteritems()
方法获取项目的迭代器。
现在,要获取前N个项目,您可以使用islice
中的itertools
方法。
>>> import itertools
>>> toptwo = itertools.islice(ordered.iteritems(), 2)
>>> list(toptwo)
[('c', 30), ('b', 20)]
>>>