字典中堆的最大元素

时间:2013-02-08 01:06:43

标签: python dictionary

我有以下代码使用堆来获取具有最高值的字典元素,但它没有返回预期的结果:

import heapq
import operator
a={'third': 3, 'fourth': 2, 'first': 5, 'second': 4}
heapq.nlargest(4,a,operator.itemgetter(1))
>>['fourth', 'first', 'third', 'second']

为什么不回来:

>>['first' , 'second' , 'third' , 'fourth']

感谢。

3 个答案:

答案 0 :(得分:3)

看看operator.itemgetter(1)对您的词典实际做了什么:

>>> map(operator.itemgetter(1), a)
['e', 'o', 'h', 'i']

当您遍历字典时,您将遍历键。由于您需要,请使用a.get来获取项目:

>>> map(a.get, a)
[4, 2, 3, 5]

a.get(key)是一种类似于a[key]的方法,所以它基本上是这样做的:

>>> [a[key] for key in a]
[4, 2, 3, 5]

现在您的代码可以运行:

>>> heapq.nlargest(4, a, a.get)
['first', 'second', 'third', 'fourth']

答案 1 :(得分:1)

当您遍历dict时,您将迭代其键。

因此,当您应用operator.itemgetter(1)时,每个密钥都会获得key[1]。这意味着每个名字的第二个字母。

如果要迭代键和值,请使用items

>>> heapq.nlargest(4,a.items(),operator.itemgetter(1))
[('first', 5), ('second', 4), ('third', 3), ('fourth', 2)]

答案 2 :(得分:0)

operator.itemgetter(1)没有按照您的想法行事。试试这个:

>>> heapq.nlargest(4, a, a.__getitem__)
['first', 'second', 'third', 'fourth']

operator.itemgetter(1)只会从传递给它的所有内容中获取带有键1的元素,在这种情况下,这是每个单词的第二个字母。确实,'o' > 'i' >= 'i' > 'e'