2012-03-29 24 views
19

Anahtar veya değer göre sıralayabilirim, ancak bir satırda, sonra değer, sonra anahtar göre sıralı ihtiyacım var. Sana sorunu gösterebilir bu daha iyi açıklamak için:Değere göre bir sözlüğü sıralama sonra anahtar

dict = {'apple': 2, 'banana': 3, 'almond':2 , 'beetroot': 3, 'peach': 4} 

benim çıkış onların tuşu (alfabetik) tarafından (A-Z) artan sonra kendi değeriyle inen sıralanıp olmak istiyorum. Böyle bir listede Çıkan:

çıkışında olarak: Şimdiye kadar bunu nasıl biliyor ['peach', 'banana', 'beetroot', 'almond', 'apple']

tek yolu ise: ['almond', 'apple', 'banana', 'beetroot', 'peach']

: çıkışını ile

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k))] 

Böylece, artan sırada ve tuşlara artan sırada alfabetik olarak sıralanır (AZ). Bu yüzden bu tersine çevirirsek:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k), reverse=True)] 

çıkışını ile: ['peach', 'beetroot', 'banana', 'apple', 'almond']

O alfabetik sırasını (Z-A) büyükten küçüğe azalan değerleri ve anahtarları sıralanmış etmiştir.

Değerleri azalan düzende ve anahtarları artan sırada (yani A-Z) sıralamak ve yukarıda gösterdiğim çıktıyı elde etmenin bir yolu var mı?

cevap

34

Değerlerin sayı olduğu gerçeğinden yararlanmanız gerekir.

>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))] 
['peach', 'banana', 'beetroot', 'almond', 'apple'] 
+6

Python 3 demet parametresi açma uzaklaştırıldı, böylece hat üzerinde hemen '[v [0] sıralanmış (d.items()' de v, tuş = lambda kv olarak bildirilmesi gerekmektedir Sadece bir hatırlatma : (-kv [1], kv [0]))]. Bkz. PEP 3113 https://www.python.org/dev/peps/pep-3113/ –

+0

Anahtar işlev, 'operator.itemgetter (1, 0) '* olarak yazılabilir. anahtar/değerden birinin sıralanması. – Moberg

5

Azalan değere göre sıralamak, negatif değerler için, negatif değerden artan sıraya göre sıralamaktır.

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))] 
1
>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4} 
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))] 
['peach', 'banana', 'beetroot', 'almond', 'apple'] 
İlgili konular