Ho un dizionario come:Come si scorre su un dizionario Python, ordinato per valori?
{ 'a': 6, 'b': 1, 'c': 2 }
mi piacerebbe scorrere su di esso per valore, non a chiave. In altre parole:
(b, 1)
(c, 2)
(a, 6)
Qual è il modo più diretto?
Ho un dizionario come:Come si scorre su un dizionario Python, ordinato per valori?
{ 'a': 6, 'b': 1, 'c': 2 }
mi piacerebbe scorrere su di esso per valore, non a chiave. In altre parole:
(b, 1)
(c, 2)
(a, 6)
Qual è il modo più diretto?
sorted(dictionary.items(), key=lambda x: x[1])
per quelli di voi che odiano lambda :-)
import operator
sorted(dictionary.items(), key=operator.itemgetter(1))
Tuttavia operator
versione richiede CPython 2.5+
Il metodo items
fornisce un elenco di (chiave, valore) tuple, che può essere ordinato utilizzando sorted
e una chiave di ordinamento personalizzata:
Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13)
>>> a={ 'a': 6, 'b': 1, 'c': 2 }
>>> sorted(a.items(), key=lambda (key,value): value)
[('b', 1), ('c', 2), ('a', 6)]
In Python 3, l'espressione lambda dovrà essere modificata in lambda x: x[1]
.
Si potrebbe voler rimuovere le prime tre righe e l'ultima ... sembra un po 'occupato in questo momento. –
Si noti che tuple unpacking non è più supportato in Python 3 ... sfortunatamente. – Stephan202
@Nikhil Penso che l'intestazione sia importante. Soprattutto per il commento di @ Stephan, è significativo quale versione sto usando per la demo. –
Per i programmi non Python 3, ti consigliamo di utilizzare iteritems per ottenere l'aumento delle prestazioni dei generatori, che producono valori uno alla volta invece di restituirli tutti in una volta.
sorted(d.iteritems(), key=lambda x: x[1])
Per dizionari di ancora più grandi, possiamo fare un passo ulteriore e hanno la funzione di chiave be in C invece di Python come è adesso con la lambda.
import operator
sorted(d.iteritems(), key=operator.itemgetter(1))
Urrà!
Oooh. Bello con operator.itemgetter. Dolce. –
Anche se non ho ancora provato, sono scettico sull'affermazione che 'ordinato' ha prestazioni migliori su un iteratore consumabile rispetto a un elenco. Immagino che la primissima cosa 'ordinata' faccia sia leggere quell'iteratore in una lista comunque; non è chiaro se ci sia un guadagno in termini di prestazioni, qui. –
Spesso può essere molto utile utilizzare namedtuple. Ad esempio, si dispone di un dizionario di nome e punteggio e si desidera ordinare il 'punteggio':
import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}
ordinamento con il punteggio più basso prima:
worst = sorted(Player(v,k) for (k,v) in d.items())
ordinamento con il punteggio più alto prima:
best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
L'ordine di "chiave" e "valore" nelle tuple elencate è (valore, chiave), ma ora è possibile ottenere il nome e il punteggio di, diciamo il secondo miglior giocatore (indice = 1) molto Pythonically così:
player = best[1]
player.name
'Richard'
player.score
7
duplicare http://stackoverflow.com/questions/613183/sort-a-dictionary-in-python-by-the-value –
Non una vittima. L'altro vuole ordinare un dizionario, il che è impossibile. Voglio ripetere su un dizionario in un ordine ordinato. – mike
e il codice è esattamente lo stesso. – SilentGhost