将有序字典中的前N个键值对复制到另一个有序字典中

10

我有一个按值排序的有序字典(OrderedDict)。如何获取前25个键-值对并将它们添加到一个新的字典中? 例如:我的字典类似于以下内容:

dictionary={'a':10,'b':20,'c':30,'d':5}
ordered=OrderedDict(sorted(dictionary.items(), key=lambda x: x[1],reverse=True))

现在ordered是一个有序字典,我想创建一个字典,假设我要取最高频率的两个项目及其键:

frequent={'c':30,'b':20}
4个回答

16

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)]

6

只需使用已有的(反向)有序字典中的前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函数进行比较)的事物。

3

您尝试过对元组列表进行排序并索引以获取前n个最常见的项及其键吗?例如,如果您需要前2个最常见的项,可以执行以下操作:

dictionary={'a':10,'b':20,'c':30,'d':5}
ordered=dict(sorted(dictionary.items(), key=lambda x: x[1],reverse=True)[:2])

1

ordered.iteritems()方法中获取项目的迭代器。

现在,要获取前N个项目,您可以使用itertools中的islice方法。

>>> import itertools
>>> toptwo = itertools.islice(ordered.iteritems(), 2)
>>> list(toptwo)
[('c', 30), ('b', 20)]
>>>

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