sumar - ¿Cómo itero sobre un diccionario de Python, ordenado por valores?
python comparar diccionarios (4)
Tengo un diccionario como:
{ ''a'': 6, ''b'': 1, ''c'': 2 }
Me gustaría iterar sobre él por valor , no por clave. En otras palabras:
(b, 1)
(c, 2)
(a, 6)
¿Cuál es la forma más sencilla?
A menudo puede ser muy útil utilizar namedtuple . Por ejemplo, tiene un diccionario de nombre y puntuación y desea clasificar en ''puntuación'':
import collections
Player = collections.namedtuple(''Player'', ''score name'')
d = {''John'':5, ''Alex'':10, ''Richard'': 7}
clasificación con la puntuación más baja primero:
worst = sorted(Player(v,k) for (k,v) in d.items())
clasificación con la 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 la puntuación de, digamos que el segundo mejor jugador (índice = 1) es muy pitónicamente así:
player = best[1]
player.name
''Richard''
player.score
7
El método de items
le proporciona una lista de tuplas (clave, valor), que se pueden ordenar utilizando una 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]
.
Para programas que no sean de Python 3, querrá usar iteritems para obtener el aumento de rendimiento de los generadores, que generan valores de uno en uno en lugar de devolverlos todos a la vez.
sorted(d.iteritems(), key=lambda x: x[1])
Para diccionarios aún más grandes, podemos ir un paso más allá y tener la función clave en C en lugar de en Python, tal como está ahora con la lambda.
import operator
sorted(d.iteritems(), key=operator.itemgetter(1))
¡Hurra!
sorted(dictionary.items(), key=lambda x: x[1])
para estos de ustedes que odian a lambda :-)
import operator
sorted(dictionary.items(), key=operator.itemgetter(1))
Sin embargo operator
versión del operator
requiere CPython 2.5+