2963 votos

Ordenar un diccionario Python por valor

Tengo un diccionario de valores leído de dos campos de una base de datos: un campo de cadena y un campo numérico. El campo de cadena es único, por lo que es la clave del diccionario.

Puedo ordenar por las claves, pero ¿cómo puedo ordenar por los valores?

Nota: He leído la pregunta de Stack Overflow ¿Cómo puedo ordenar una lista de diccionarios por valores del diccionario en Python? y probablemente podría cambiar mi código para tener una lista de diccionarios, pero como realmente no necesito una lista de diccionarios quería saber si hay una solución más sencilla.

3579voto

Devin Jeanpierre Puntos 23162

No es posible ordenar un dict, sólo obtener una representación de un dict ordenado. Los dict son inherentemente sin orden, pero otros tipos, como las listas y las tuplas, no lo son. Así que necesitas una representación ordenada, que será una lista -probablemente una lista de tuplas-.

Por ejemplo,

import operator
x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))

sorted_x será una lista de tuplas ordenadas por el segundo elemento de cada tupla. dict(sorted_x) == x .

973voto

Nas Banov Puntos 7293

Tan simple como eso: sorted(dict1, key=dict1.get)

Bueno, en realidad es posible hacer una "ordenación por valores del diccionario". Hace poco tuve que hacerlo en un Code Golf (pregunta de Stack Overflow Código de golf: Tabla de frecuencia de palabras ). De forma abreviada, el problema era del tipo: dado un texto, contar la frecuencia con la que se encuentra cada palabra y mostrar la lista de las principales palabras, ordenadas por frecuencia decreciente.

Si se construye un diccionario con las palabras como claves y el número de ocurrencias de cada palabra como valor, simplificado aquí como

d = defaultdict(int)
for w in text.split():
  d[w] += 1

entonces puede obtener la lista de las palabras en orden de frecuencia de uso con sorted(d, key=d.get) - la ordenación itera sobre las claves del diccionario, utilizando como clave de ordenación el número de ocurrencias de la palabra.

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

Estoy escribiendo esta explicación detallada para ilustrar lo que la gente a menudo quiere decir con "Puedo fácilmente ordenar un diccionario por clave, pero ¿cómo puedo ordenar por valor" - y creo que el OP estaba tratando de abordar esta cuestión. Y la solución es hacer una ordenación de la lista de las claves, basada en los valores, como se muestra arriba.

609voto

Mark Puntos 1621

Podrías usar:

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

Esto ordenará el diccionario por los valores de cada entrada dentro del diccionario de menor a mayor.

167voto

Roberto Bonvallet Puntos 6336

Los dictados no se pueden ordenar, pero se puede construir una lista ordenada a partir de ellos.

Una lista ordenada de valores dict:

sorted(d.values())

Una lista de pares (clave, valor), ordenados por valor:

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

128voto

mykhal Puntos 5873

En la reciente versión 2.7 de Python, tenemos el nuevo OrderedDict que recuerda el orden en que se añadieron los elementos.

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

Hacer un nuevo diccionario ordenado a partir del original, ordenando por los valores:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

El OrderedDict se comporta como un dict normal:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X