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

辞書を反復処理するときは、キーを反復処理します。が必要なので、useを使用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']
于 2013-02-08T01:16:15.590 に答える
1

を反復dict処理すると、そのキーを反復処理します。

したがって、適用すると、各キーをoperator.itemgetter(1)取得できます。key[1]これは、各名前の2番目の文字を意味します。

キーと値を反復処理する場合は、次を使用します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渡されたすべてのものからキーを持つ要素をフェッチするだけです。この場合は、各単語の2番目の文字です。そして確かに、'o' > 'i' >= 'i' > 'e'

于 2013-02-08T01:13:54.257 に答える