2009-03-23 28 views
14

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?

+0

duplicare http://stackoverflow.com/questions/613183/sort-a-dictionary-in-python-by-the-value –

+2

Non una vittima. L'altro vuole ordinare un dizionario, il che è impossibile. Voglio ripetere su un dizionario in un ordine ordinato. – mike

+0

e il codice è esattamente lo stesso. – SilentGhost

risposta

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

+0

Ho bisogno delle chiavi e degli oggetti, non solo degli articoli. – mike

+0

dictionary.items() fornisce sia le chiavi che i valori, non solo i tasti. –

+1

@Mike: gli articoli sono coppie (chiave, valore). – vartec

3

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

+0

Si potrebbe voler rimuovere le prime tre righe e l'ultima ... sembra un po 'occupato in questo momento. –

+1

Si noti che tuple unpacking non è più supportato in Python 3 ... sfortunatamente. – Stephan202

+0

@Nikhil Penso che l'intestazione sia importante. Soprattutto per il commento di @ Stephan, è significativo quale versione sto usando per la demo. –

7

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

+0

Oooh. Bello con operator.itemgetter. Dolce. –

+0

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

4

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