[英]finding top k largest keys in a dictionary python
假设我有一本字典:
{key1:value1........... keyn:valuen}
所以让我们说我想写一个函数
def return_top_k(dictionary, k):
return list_of_keys_sorted
获取具有前 k 个值的键的最有效方法是什么(就大 O 而言)(保持顺序,即最高值键出现在开头......等等。)
O(n log k)
:
import heapq
k_keys_sorted = heapq.nlargest(k, dictionary)
您可以使用key
关键字参数来指定应该用作排序键的内容,例如:
k_keys_sorted_by_values = heapq.nlargest(k, dictionary, key=dictionary.get)
return sorted(dictionary, key=dictionary.get, reverse=True)[:10]
最坏的情况应该是O(NlogN)
(尽管其他人提出的heapq
可能更好)......
使用Counter
而不是常规字典也可能有意义。 在这种情况下, most_common
方法将(大约)执行您想要的操作( dictionary.most_common(10)
),但Counter
在您的 API 中使用Counter
是有意义的。
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
对于前三名一步一步:
>>> from operator import itemgetter
>>> dct = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
>>> sorted(dct.items(), key=itemgetter(1), reverse=True)
[('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)]
>>> map(itemgetter(0), sorted(dct.items(), key=itemgetter(1), reverse=True))
['e', 'd', 'c', 'b', 'a']
>>> map(itemgetter(0), sorted(dct.items(), key=itemgetter(1), reverse=True))[:3]
['e', 'd', 'c']
或者使用heapq
模块
>>> import heapq
>>> heapq.nlargest(3, dct.items(), key=itemgetter(1))
[('e', 5), ('d', 4), ('c', 3)]
>>> map(itemgetter(0), _)
['e', 'd', 'c']
在代码中
dct = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
k = 3
print sorted(dct.keys(), reverse=True)[:k]
如果您还需要值:
print sorted(dct.items(), reverse=True)[:k]
或者,如果您想使用OrderedDict
:
from collections import OrderedDict
d = OrderedDict(sorted(dct.items(), reverse=True))
print d.keys()[:k]
所以如果你想从字典中打印前 K 个频繁元素; 你必须使用 heapq.nlargest 函数。
这是相同的示例:
return heapq.nlargest(k,count.keys(), key = count.get)
这里,k 是帮助我们找出在字典中重复 k 次或超过 k 次的元素的数字。
count.keys()
:这为您提供了使用collections.counter
创建的堆中的键或元素
key = count.get()
:这用于打印堆的键。 如果我们跳过这个; 它将打印字典的值,即元素在字典中出现的次数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.