1

この dict を 2 つの連続した基準で並べ替える必要があります。「ランク」の降順、「フルーツ」の昇順です (ランキング結果が同じ場合)。

辞書はこのように構成されています

'object':['fruit',rank]

たとえば、私は:

myDict = {'item2': ['bananas', 3], 'item3': ['cocumbers', 11], 'item1': ['pinapples', 3], 'item4': ['pears', 3]}

私の目的はこれを取得することです:

{'item3': ['cocumbers', 11], 'item2': ['bananas', 3],'item4': ['pears', 3], 'item1': ['pinapples', 3]}

sorted(myDict.items(), key=lambda (k, v): v[1], reverse=True)

ランクの正しい並べ替えのみを取得しますが、同じランクのオブジェクトの並べ替え順序はありません。

[('item3', ['cocumbers', 11]), ('item2', ['bananas', 3]), ('item1', ['pinapples', 3]), ('item4', ['pears', 3])]

Python 2.7でこれをどのように解決しますか?

ありがとう

4

2 に答える 2

5

sorted(myDict.items(), key=lambda (k, v): (-v[1],v[0]))

トリックを行う必要があります。は整数であるため、キーワード to をrank必要とするのではなく、キー関数が負の値を返すようにすることで、簡単に降順で並べ替えることができます。同点の場合は、文字列の自然な順序に戻ります。 reverse=Truesorted

これは、Python のシーケンスが辞書順で並べ替えられるため (tuplesはシーケンス タイプです)、Python は各シーケンスの要素を順番に比較し、要素の 1 つが等しくなく、シーケンスのペアの順序を示します。

キー関数で簡単に置き換えることができない場合は、reverse=True2 回ソートする必要があります。

l1 = sorted(myDict.items(),key=lambda (k,v):v[0])
l1.sort(key=lambda (k,v):v[1],reverse=True)

これは、python ソートは安定していなければならないという文書化された事実に依存しています。つまり、等しい要素の相対的な順序は、並べ替えの前後で同じです。

于 2013-01-25T15:42:16.907 に答える
0

辞書内の順序を維持するには、 collections.OrderedDictを使用する必要があります。

于 2013-01-25T15:42:36.323 に答える