2011-10-12 8 views
20

によってその値によって辞書を並べ替え、それはだまされやすい人である必要がありますが、私のSO-検索府が今日悪いようにこれはそうです...は、キー

はどのようにすることができます、私は整数のキー/値の辞書を持っていると言います私は値を降順に並べ替え、次にキーを降順に並べ替えます(一般的な値)。

入力:

{12:2, 9:1, 14:2} 
{100:1, 90:4, 99:3, 92:1, 101:1} 

出力:

[(14,2), (12,2), (9,1)] # output from print 
[(90,4), (99,3), (101,1), (100,1), (92,1)] 

答えて

37
In [62]: y={100:1, 90:4, 99:3, 92:1, 101:1} 
In [63]: sorted(y.items(), key=lambda x: (x[1],x[0]), reverse=True) 
Out[63]: [(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)] 

key=lambda x: (x[1],x[0])プロキシ値をソートするようy.items()の各項目xため、(x[1],x[0])を使用することsortedを伝えます。 x(key,value)の形式であるので、(x[1],x[0])(value,key)を生成する。これにより、最初にvalueで並べ替え、次にタイブレーカーではkeyでソートすることが、sortedになります。

reverse=Trueは、昇順ではなく降順で結果を表示するように指示します。

Pythonでソートするための素晴らしいチュートリアルについてはwiki pageを参照してください。

PS。私はkey=reversedを代わりに使ってみましたが、reversed(x)はイテレータを返します。イテレータはここで必要に応じて比較しません。

+1

1:Pythonの組み込み機能の非常に良い使用。 – EOL

+0

私は同じ出力を取得しません...私は初版の答えをキャッチし、それは私が必要なものを正確にしました。 –

+2

いいですが、少し書いています...しかし、私はanythinをもっと簡単に考えることはできません。 – Don

1

はこれを試してみてください:

>>> d={100:1, 90:4, 99:3, 92:1, 101:1} 
>>> sorted(d.items(), lambda a,b:b[1]-a[1] or a[0]-b[0]) 
2

は多分これはより明確である:

>>> y = {100:1, 90:4, 99:3, 92:1, 101:1} 
>>> reverse_comparison = lambda (a1, a2), (b1, b2):cmp((b2, b1), (a2, a1)) 
>>> sorted(y.items(), cmp=reverse_comparison) 
[(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]