2011-10-12 13 views
20

Wydaje się, że ma być dupe ale mój SO-wyszukiwanie-fu jest słaba dzisiaj ...Sortowanie słownika wartości następnie przez klucz

Say mam słownika całkowitych klucz/wartość, w jaki sposób Sortuję słownik według wartości malejących, a następnie według klucza malejącego (dla wspólnych wartości).

Wejście:

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

wyjściowa:

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

Odpowiedz

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]) mówi sorted że dla każdego elementu x w y.items() użyć (x[1],x[0]) jako wartość proxy mają być sortowane. Od x jest w postaci (key,value), (x[1],x[0]) daje (value,key). To powoduje, że sorted sortuje najpierw przez value, a następnie key dla łamaczy tie-breakerów.

reverse=True mówi sorted, aby przedstawić wynik w porządku malejącym, a nie rosnącym.

Zobacz ten wiki page świetny samouczek na temat sortowania w Pythonie.

PS. Próbowałem zamiast tego używać key=reversed, ale reversed(x) zwraca iterator, który tutaj nie jest porównywany.

+1

+1: bardzo dobre wykorzystanie wbudowanych funkcji Pythona. – EOL

+0

Nie mam tego samego wyjścia ... Przyłapałem się na pierwszej edycji i zrobiłem dokładnie to, czego potrzebowałem. –

+2

Przyjemnie, ale trochę cryptic ... ale nie mogę myśleć o czymkolwiek prostszym. – Don

1

Spróbuj tego:

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

Może to jest bardziej wyraźne:

>>> 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)] 
Powiązane problemy