2011-10-12 38 views
20

Questo sembra che deve essere una vittima, ma il mio SO-ricerca-fu è scarsa oggi ...Ordinamento un dizionario in base al valore poi a chiave

dire che ho un dizionario di interi chiave/valore, come si può Ordino il dizionario in base ai valori decrescente, quindi in base alla chiave decrescente (per valori comuni).

ingresso:

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

uscita:

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

risposta

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

Il key=lambda x: (x[1],x[0]) dice sorted che ogni voce x in y.items(), utilizzare (x[1],x[0]) come valore delega da ordinare. Poiché x ha il formato (key,value), (x[1],x[0]) produce (value,key). Ciò causa sorted per ordinare prima per value, quindi per key per i tie-breaker.

reverse=True indica sorted per presentare il risultato in ordine decrescente anziché in ordine crescente.

Vedere questo wiki page per un ottimo tutorial sull'ordinamento in Python.

PS. Ho provato a utilizzare key=reversed invece, ma reversed(x) restituisce un iteratore, che non confronta come necessario qui.

+1

+1: buon uso delle funzionalità incorporate di Python. – EOL

+0

Non ottengo lo stesso risultato ... Ho preso la prima risposta di edizione e ha fatto esattamente quello che mi serviva. –

+2

Bello, ma un po 'criptico ... ma non riesco a pensare a niente di più semplice. – Don

1

Prova questo:

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

Forse questo è più esplicito:

>>> 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)] 
Problemi correlati