Cómo ordenar un diccionario por valor en Python

C

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 según el orden de inserción del elemento. En versiones anteriores, estaban desordenadas.

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

Ordenar diccionario usando un bucle for

Podemos ordenar un diccionario con la ayuda de un for lazo. Primero, usamos el sorted() función 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: La clasificación no le permite reordenar el diccionario en su lugar. Estamos escribiendo los pares ordenados en un diccionario vacío completamente nuevo.

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, 3: 4, 2: 9}

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

Ordenar diccionario usando la función sorted ()

Usamos previamente el sorted() función para ordenar los valores de una matriz. Al ordenar un diccionario, podemos pasar un argumento más al sorted() funciona así: sorted(dict1, key=dict1.get).

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

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

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}

Utilizando el sorted() La función ha reducido la cantidad de código que teníamos que escribir al usar for bucles. Sin embargo, podemos combinar aún más sorted() funcionar con el itemgetter() función para una solución más sucinta para ordenar diccionarios por valores.

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

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

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

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 a la items() método. Esta función devuelve los pares clave-valor de un diccionario como una lista de tuplas. Podemos ordenar la lista de tuplas usando el itemgetter() función 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:

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 key El argumento acepta cualquier función, podemos usar funciones lambda para devolver valores de diccionario para que puedan ser ordenados. Veamos cómo.

Ordenar diccionario mediante una función Lambda

Las funciones de 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 operator módulo para itemgetter(). Si desea obtener más información sobre lambas, puede leer sobre ellas en nuestra guía de funciones Lambda en Python.

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

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 con las versiones anteriores de Python.

Devolver un diccionario nuevo con valores ordenados

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

A continuación, se muestra un ejemplo de clasificación y uso OrderedDict:

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 nuestro tipo usando el sorted() función. También hemos visto el itemgetter() función de la operator El módulo puede hacer que nuestra solución sea más concisa.

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

Variaciones del sorted() son las más populares y fiables para ordenar un diccionario por valores.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad