从有序字典中获取前N个键值对到另一个字典

10 投票
4 回答
18005 浏览
提问于 2025-04-17 07:09

我有一个按值排序的有序字典(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 个回答

3

你有没有尝试过对排序后的元组列表进行索引,以获取出现频率最高的前n个项目及其键?
比如,如果你需要找出出现频率最高的前两个项目,你可以这样做:

dictionary={'a':10,'b':20,'c':30,'d':5}
ordered=dict(sorted(dictionary.items(), key=lambda x: x[1],reverse=True)[:2])
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 函数进行比较)就可以。

16

collections.OrderedDict的主要目的是保持元素被插入的顺序。
而你这里需要的是 collections.Counter,它内置了计算出现频率的功能:

>>> dictionary={'a':10,'b':20,'c':30,'d':5}
>>> import collections
>>> collections.Counter(dictionary).most_common(2)
[('c', 30), ('b', 20)]

撰写回答