在字典python中找到前k个最大的键

时间:2012-09-04 15:22:53

标签: python

假设我有一本字典:

{key1:value1........... keyn:valuen}

所以我想说我想写一个函数

def return_top_k(dictionary, k):

    return list_of_keys_sorted   

获得具有前k个值的键的最有效方式(就大O而言)是什么(保持顺序,即最高值键出现在开头......等等。)

6 个答案:

答案 0 :(得分:16)

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)

答案 1 :(得分:4)

return sorted(dictionary, key=dictionary.get, reverse=True)[:10]

应该是最差的O(NlogN)(尽管其他人提出的heapq可能更好)...

使用Counter代替常规字典可能也是有意义的。在这种情况下,most_common方法会(大约)执行您想要的操作(dictionary.most_common(10)),但前提是在您的API中使用Counter是有意义的。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

前三步一步:

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

答案 4 :(得分:1)

代码

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]

答案 5 :(得分:0)

所以如果你想从字典中打印前 K 个频繁元素;你必须使用 heapq.nlargest 函数。

以下是相同的示例:

return heapq.nlargest(k,count.keys(), key = count.get)

这里,k 是帮助我们找出在字典中重复 k 次或超过 k 次的元素的数字。

count.keys() :这为您提供了使用 collections.counter

创建的堆中存在的键或元素

key = count.get() :这用于打印堆的键。如果我们跳过这个;它将打印字典的值,即元素在字典中出现的次数。