Cómo ordenar un diccionario por valor en Python

En este artículo, exploraremos cómo ordenar un diccionario en Python por su valor. Estas soluciones utilizan bucles for y la función sorted(), así como lambdas y el módulo de operador.

Introducción

Un diccionario en Python es una colección de elementos que almacena datos como pares clave-valor. En Python 3.7 y versiones posteriores, los diccionarios se ordenan por orden de inserción de elementos. En versiones anteriores, estaban desordenados.

Echemos un vistazo a cómo podemos ordenar un diccionario en función de los valores que contienen.

Ordenar diccionario usando un bucle for

Podemos ordenar un diccionario con la ayuda de un bucle for. Primero, usamos la función sorted() para ordenar los valores del diccionario. Luego recorremos los valores ordenados, encontrando las claves para cada valor. Agregamos estos pares clave-valor en el orden ordenado en un nuevo diccionario.

Nota: Ordenar no le permite reordenar el diccionario en el lugar. Estamos escribiendo los pares ordenados en un diccionario completamente nuevo y vacío.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) # Sort the values
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]
            break

print(sorted_dict)

Si ejecuta esto con el intérprete de Python, verá:

1
{1: 1, 3: 4, 2: 9}

Ahora que hemos visto cómo ordenar con bucles, veamos una alternativa más popular que usa la función sorted().

Ordenar diccionario usando la función sorted()

Previamente usamos la función sorted() para ordenar los valores de una matriz. Cuando ordenamos un diccionario, podemos pasar un argumento más a la función sorted() como este: sorted(dict1, key=dict1.get).

Aquí, key es una función que se llama en cada elemento antes de comparar los valores para clasificarlos. El método get() en objetos de diccionario devuelve el valor de para la clave de un diccionario.

La expresión sorted(dict1, key=dict1.get) devolverá la lista de claves cuyos valores están ordenados. A partir de ahí, podemos crear un nuevo diccionario ordenado:

1
2
3
4
5
6
7
8
dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  # [1, 3, 2]

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) # {1: 1, 3: 4, 2: 9}

El uso de la función sorted() ha reducido la cantidad de código que teníamos que escribir cuando usamos bucles for. Sin embargo, podemos combinar aún más la función sorted() con la función itemgetter() para obtener una solución más sucinta a la clasificación de diccionarios por valores.

Ordenar diccionario usando el módulo operator y itemgetter()

El módulo operator incluye la función itemgetter(). Esta función devuelve un objeto invocable que devuelve un elemento de un objeto.

Por ejemplo, usemos itemgetter() para crear un objeto invocable que devuelva el valor de cualquier diccionario con una clave 2:

1
2
3
4
5
6
import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  # 9

Cada diccionario tiene acceso al método items(). Esta función devuelve los pares clave-valor de un diccionario como una lista de tuplas. Podemos ordenar la lista de tuplas usando la función itemgetter() para extraer el segundo valor de la tupla, es decir, el valor de las claves en el diccionario.

Una vez ordenado, podemos crear un diccionario basado en esos valores:

1
2
3
4
5
6
7
8
import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  # [(1, 1), (3, 4), (2, 9)]
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) # {1: 1, 3: 4, 2: 9}

¡Con mucho menos esfuerzo, tenemos un diccionario ordenado por valores!

Como el argumento key acepta cualquier función, podemos usar funciones lambda para devolver valores de diccionario para que puedan ordenarse. Veamos cómo.

Ordenar diccionario usando una función Lambda

Las funciones Lambda son funciones anónimas o sin nombre en Python. Podemos usar funciones lamba para obtener el valor de un elemento del diccionario sin tener que importar el módulo operator para itemgetter(). Si quieres saber más sobre las lambas, puedes leer sobre ellas en nuestra guía de Funciones Lambda en Python.

Ordenemos un diccionario por valores usando una función lambda en el argumento key de sorted():

1
2
3
4
5
6
dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  # [(1, 1), (3, 4), (2, 9)]
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  # {1: 1, 3: 4, 2: 9}

Tenga en cuenta que los métodos que hemos discutido hasta ahora solo funcionan con Python 3.7 y versiones posteriores. Veamos qué podemos hacer para versiones anteriores de Python.

Devolver un diccionario nuevo con valores ordenados {#devolver un nuevo diccionario con valores ordenados}

Después de ordenar un diccionario por valores, para mantener un diccionario ordenado en las versiones de Python anteriores a la 3.7, debe usar OrderedDict, disponible en el módulo colecciones. Estos objetos son diccionarios que mantienen el orden de inserción.

Aquí hay un ejemplo de clasificación y uso de OrderedDict:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  # [(1, 1), (3, 4), (2, 9)]

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  # {1: 1, 3: 4, 2: 9}

Conclusión

Este tutorial mostró cómo se puede ordenar un diccionario en función de sus valores. Primero ordenamos un diccionario usando dos bucles for. Luego mejoramos nuestra ordenación usando la función sorted(). También hemos visto que la función itemgetter() del módulo operator puede hacer que nuestra solución sea más sucinta.

Por último, adaptamos nuestra solución para que funcione en versiones de Python anteriores a la 3.7.

Las variaciones de la función sorted() son las más populares y confiables para ordenar un diccionario por valores.

Licensed under CC BY-NC-SA 4.0