2009-03-23 27 views
14

Tengo un diccionario como:¿Cómo iterar sobre un diccionario de Python, ordenado por valores?

{ 'a': 6, 'b': 1, 'c': 2 } 

me gustaría que iterar sobre por valor, no por la llave. En otras palabras:

(b, 1) 
(c, 2) 
(a, 6) 

¿Cuál es la manera más directa?

+0

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

+2

No es una víctima. El otro quiere ordenar un diccionario, lo cual es imposible. Quiero iterar sobre un diccionario en un orden ordenado. – mike

+0

y el código es exactamente el mismo. – SilentGhost

Respuesta

30
sorted(dictionary.items(), key=lambda x: x[1]) 

para aquellos de ustedes que el odio lambda :-)

import operator 
sorted(dictionary.items(), key=operator.itemgetter(1)) 

Sin embargo operator versión requiere CPython 2.5+

+0

Necesito las llaves y los artículos, no solo los artículos. – mike

+0

dictionary.items() le proporciona tanto las claves como los valores, no solo las teclas. –

+1

@Mike: los elementos son pares (clave, valor). – vartec

3

El método items le da una lista de (clave, valor) tuplas, que se puede ordenar usando sorted y una clave de clasificación personalizada:

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

En Python 3, la expresión lambda tendrá que cambiarse a lambda x: x[1].

+0

Es posible que desee eliminar las primeras tres líneas y la última ... parece un poco ocupada en este momento. –

+1

Tenga en cuenta que el desempaque tuple ya no es compatible con Python 3 ... desafortunadamente. – Stephan202

+0

@Nikhil Creo que el encabezado es importante. Especialmente por el comentario de @ Stephan, es significativa la versión que estoy usando para la demostración. –

7

Para programas que no sean Python 3, querrá utilizar iteritems para obtener el aumento del rendimiento de los generadores, que producen valores de uno en uno en lugar de devolverlos todos al mismo tiempo.

sorted(d.iteritems(), key=lambda x: x[1]) 

Por diccionarios aún más grandes, podemos ir un paso más allá y tienen la función de la tecla be in C en lugar de Python, ya que es en este momento con la lambda.

import operator 
sorted(d.iteritems(), key=operator.itemgetter(1)) 

¡Hurra!

+0

Oooh. Agradable con el operator.itemgetter. Dulce. –

+0

Aunque no lo he probado, soy escéptico sobre la afirmación de que 'ordenado' funciona mejor en un iterador de consumibles que en una lista. Supongo que lo primero que 'sorted' hace es leer ese iterador en una lista de todos modos; no está muy claro si hay una ganancia de rendimiento, aquí. –

4

A menudo puede ser muy útil usar namedtuple. Por ejemplo, usted tiene un diccionario de nombre y puntuación y que desea ordenar en 'puntuación':

import collections 
Player = collections.namedtuple('Player', 'score name') 
d = {'John':5, 'Alex':10, 'Richard': 7} 

clasificación con baja puntuación primera:

worst = sorted(Player(v,k) for (k,v) in d.items()) 

clasificación con puntuación más alta primero:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True) 

El orden de 'clave' y 'valor' en las tuplas enumeradas es (valor, clave), pero ahora puede obtener el nombre y puntaje de, digamos, el segundo mejor jugador (índice = 1) muy Pythonically como este:

player = best[1] 
    player.name 
     'Richard' 
    player.score 
     7 
Cuestiones relacionadas