¿Cómo puedo ordenar un diccionario por valor

python sorting dictionary


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,así que esa es la clave del diccionario.

Puedo ordenar en las claves,pero ¿cómo puedo ordenar en base a los valores?

Nota: He leído la pregunta de desbordamiento de pila aquí. ¿Cómo clasifico una lista de diccionarios por un valor del diccionario? y probablemente podría cambiar mi código para tener una lista de diccionarios, pero dado que realmente no necesito una lista de diccionarios, quería saber si hay una solución más simple para ordenar en orden ascendente o descendente.




Answer 1 Devin Jeanpierre


Python 3.6+

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

La antigua Python

No es posible ordenar un diccionario, solo obtener una representación de un diccionario que está ordenado. Los diccionarios son inherentemente sin orden, pero otros tipos, como listas y tuplas, no lo son. Por lo tanto, necesita un tipo de datos ordenado para representar los valores ordenados, 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.items(), key=operator.itemgetter(1))

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

Y para aquellos que deseen clasificar en claves en lugar de valores:

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

En Python3 ya que no está permitido desempacar [1] podemos usar

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

Si desea la salida como un dict, puede usar collections.OrderedDict . OrderedDict :

import collections

sorted_dict = collections.OrderedDict(sorted_x)



Answer 2 Nas Banov


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

Bueno, en realidad es posible hacer un "ordenar por valores de diccionario". Recientemente tuve que hacer eso en un código de golf (pregunta de desbordamiento de pila de código de golf: tabla de frecuencia de palabras ). En resumen, el problema era del mismo tipo: dado un texto, cuente con qué frecuencia se encuentra cada palabra y muestre una lista de las palabras principales, ordenadas por frecuencia decreciente.

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

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

entonces puede obtener una lista de las palabras, ordenadas por frecuencia de uso con sorted(d, key=d.get) : la ordenación itera sobre las teclas del diccionario, utilizando el número de apariciones de palabras como clave de ordenación.

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

Escribo esta detallada explicación para ilustrar lo que la gente suele querer decir con "Puedo ordenar fácilmente un diccionario por clave,pero ¿cómo puedo ordenar por valor? Y la solución es hacer una especie de lista de las claves,basada en los valores,como se muestra arriba.




Answer 3 Mark


Te vendría bien:

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

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

Para ordenarlo en orden descendente, simplemente agregue reverse=True :

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

Input:

d = {'one':1,'three':3,'five':5,'two':2,'four':4}
a = sorted(d.items(), key=lambda x: x[1])    
print(a)

Output:

[('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]



Answer 4 Roberto Bonvallet


Los dictados no pueden ser ordenados,pero puedes construir una lista ordenada a partir de ellos.

Una lista ordenada de valores dictados:

sorted(d.values())

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

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



Answer 5 mykhal


En Python 2.7 reciente, tenemos el nuevo tipo OrderedDict , que recuerda el orden en que se agregaron 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 dictador 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)])