1

私は2つのリストを持っています

L1 = ['tom', 'jerry', 'spike', 'fido', 'donald', 'mickey']
L2 = [3,5,7,6,9,3]
dictionary = dict(zip(L1, L2))
print dictionary

sorted_friends = sorted(dictionary.iteritems(), key = operator.itemgetter(1), reverse= True)
print sorted_friends

基本的に、L1とL2から辞書を作成しています。 {'mickey': 3, 'tom': 3, 'jerry': 5, 'donald': 9, 'fido': 6, 'spike': 7} 値でソート(逆)すると、次のようになります。[('donald', 9), ('spike', 7), ('fido', 6), ('jerry', 5), ('mickey', 3), ('tom', 3)]

上位3つのキーのリストが必要です:のように[donald,spike,fido] しかし、問題は、dict()へのキャストなど、ソートを台無しにするなど、私が知っている方法を使用する場合です。

4

2 に答える 2

5

dict を使用する必要はありません。タプルのリストを作成し、適切なフィールドでソートするだけです。

sorted(zip(L1, L2), key=lambda x: x[1], reverse=True)[:3]

もちろんoperator.itemgetter(1)、必要に応じてラムダの代わりに使用できます。

事後の名前だけが必要な場合は、これを変更できます。

[a for a,_ in sorted(zip(L1, L2), key=lambda x: x[1], reverse=True)][:3]

順序を逆にするだけで、カスタムソート関数をまったく指定する必要がなくなることにも注意してください。

[b for _,b in sorted(zip(L2, L1), reverse=True)][:3]

これは、タプルのデフォルトの並べ替え順序が最初の要素、次に 2 番目の要素に従って並べ替えられるため、機能します。つまり、最初に値で並べ替えられます。

于 2012-10-07T22:51:35.507 に答える
1

3つの最大のものだけが必要な場合は、使用しないのはなぜheapqですか?

>>> L1 = ['tom', 'jerry', 'spike', 'fido', 'donald', 'mickey']
>>> L2 = [3,5,7,6,9,3]
>>> dictionary = dict(zip(L1, L2))
>>> import heapq
>>> heapq.nlargest(3, dictionary, key=dictionary.get)
['donald', 'spike', 'fido']

それも可能ですが、辞書の作成をスキップするのは少し難しいです

>>> heapq.nlargest(3, L1, key=lambda x, i2=iter(L2): next(i2))
['donald', 'spike', 'fido']
于 2012-10-08T00:39:32.067 に答える