1

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

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

?

谢谢。

4

3 回答 3

3

看看operator.itemgetter(1)你的字典实际上做了什么:

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

当您遍历字典时,您会遍历键。由于您想要values,请使用 usea.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']
于 2013-02-08T01:16:15.590 回答
1

当你迭代 adict时,你正在迭代它的键。

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

如果要遍历键和值,请使用items

>>> heapq.nlargest(4,a.items(),operator.itemgetter(1))
[('first', 5), ('second', 4), ('third', 3), ('fourth', 2)]
于 2013-02-08T01:16:30.497 回答
0

operator.itemgetter(1)不做你认为它做的事。试试这个:

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

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

于 2013-02-08T01:13:54.257 回答