我有以下代码使用堆来获取具有最高值的字典元素,但它没有返回预期的结果:
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']
感谢。
答案 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'
。