Cómo ordenar un diccionario de Python por clave o valor

En este tutorial, aprenderá a ordenar un diccionario de Python por su clave o valor.

Cuando trabaja con un diccionario en Python, hay momentos en los que necesitará ordenar su contenido, por clave o por valor. Como un diccionario de Python es una asignación de clave-valor, creará un nuevo diccionario que tenga las claves o los valores ordenados según sea necesario.

En este tutorial, comenzaremos revisando los conceptos básicos del diccionario de Python. Luego, aprenderemos a crear un nuevo diccionario en el que los contenidos se ordenen por clave o por valor, según sea necesario.

Conceptos básicos del diccionario de Python, revisado

¿Qué es un diccionario Python?

El diccionario es una estructura de datos integrada en Python. Almacena elementos como pares clave-valor. Puede usar las teclas para buscar los valores correspondientes. Como las claves identifican de forma única los valores, no debe haber repetición de claves.

py_dict = {"Python":"cool!","Learn":True}
py_dict["Python"]
# Output: cool!

py_dict["Learn"]
# Output: True

Funcionalmente, un diccionario es similar a un mapa hash. Por lo tanto, no es necesariamente una estructura de datos ordenada. Puede acceder al contenido de un diccionario en cualquier orden arbitrario, siempre que conozca las claves.

Ordenación de elementos en un diccionario

En versiones anteriores de Python, tenía que usar un dictado ordenado para preservar el orden de las llaves. Sin embargo, desde Python 3.7, puede acceder a los elementos en el mismo orden en que los agrega al diccionario.

Ahora que ha aprendido los conceptos básicos de los diccionarios de Python, aprendamos cómo crear copias ordenadas del diccionario.

⚙️ Nota: debe tener Python 3.7 o posterior para que el código de este tutorial funcione como se esperaba. Puedes descargar el última versión de Pythono ejecute los ejemplos en kirukiru.es Online Python Editor.

Cómo ordenar un diccionario de Python por clave

Fíjate en la siguiente imagen de la carta de postres de una cafetería. Hay dos columnas correspondientes a los elementos del menú y sus respectivos precios.

Puede representar esto en forma de un diccionario de Python recopilando los nombres de los artículos como claves y sus precios como valores.

Avancemos y creemos los postres del diccionario, como se muestra a continuación.

desserts = {
    "Ice cream":10,
    "Brownies":12,
    "Cheesecake":3,
    "Swiss roll":5,
    "Cookies":4,
    "Cup cake":2
}

A continuación, creemos un diccionario sorted_desserts, donde los postres se organizan en orden alfabético. En el diccionario original de postres, los nombres de los postres son las claves. Por lo tanto, debe ordenar estas claves en orden alfabético para crear un nuevo diccionario.

Cómo acceder a las claves de un diccionario de Python

Para ello, primero obtendremos las claves del diccionario y luego las ordenaremos alfabéticamente.

En Python, puede usar el método de diccionario integrado .keys() para obtener una lista de todas las claves del diccionario.

Llamemos al método .keys() en el diccionario de postres para recuperar las claves, como se muestra a continuación.

keys = desserts.keys()
print(keys)

#Output
['Ice cream', 'Brownies', 'Cheesecake', 'Swiss roll', 'Cookies', 
'Cup cake']

Llamar a la función sorted() incorporada de Python con una lista como argumento devuelve una nueva lista ordenada.

A continuación, llamemos a la función sorted() con las claves de la lista como argumento y almacenemos la lista ordenada en la variable sorted_keys.

sorted_keys = sorted(keys)
print(sorted_keys)

# Output
['Brownies', 'Cheesecake', 'Cookies', 'Cup cake', 'Ice cream', 'Swiss roll']

Ahora que tenemos las claves ordenadas alfabéticamente, podemos buscar los valores correspondientes a las claves en sorted_keys del diccionario de postres, como se muestra a continuación.

sorted_desserts = {}
for key in sorted_keys:
  sorted_desserts[key] = desserts[key]

print(sorted_desserts)

# Output
{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

Ampliemos el bloque de código anterior:

  • Inicialice sorted_desserts para que sea un diccionario de Python vacío.
  • Recorra la lista de claves sorted_keys.
  • Para cada clave en sorted_keys, agrega una entrada a sorted_desserts buscando el valor correspondiente en el diccionario de postres.

Usar el bucle for de esta manera se considera detallado. En Python, existe una alternativa más concisa que utiliza la comprensión del diccionario.

Comprensión de diccionarios en Python

Python admite el uso de la comprensión de diccionarios, similar a la comprensión de listas. La comprensión del diccionario le permite crear un nuevo diccionario de Python con solo una línea de código.

▶️ Aquí está la construcción general para usar la comprensión de diccionario en Python.

# 1. when you have both keys and values in two lists: list1, list2
new_dict = {key:value for key,value in zip(list1,list2)}

# 2. when you have the keys, and can look up the values
new_dict = {key:value for key in <iterable>}

Usemos la segunda construcción en la celda anterior: new_dict = {key:value for key in } para crear un diccionario sorted_desserts.

En este ejemplo:

  • iterable: la lista sorted_keys
  • key: la clave a la que accedemos recorriendo sorted_keys
  • valor: busca el valor correspondiente a la clave en el diccionario de postres, postres[key]

Poniéndolo todo junto, tenemos la expresión para la comprensión del diccionario, como se muestra a continuación.

sorted_desserts = {key:desserts[key] for key in sorted_keys}
print(sorted_desserts)

{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

Del resultado anterior, los postres están ordenados alfabéticamente en el diccionario sorted_desserts.

Cómo ordenar un diccionario de Python por valor

A continuación, aprenderemos a ordenar un diccionario de Python por sus valores.

En el diccionario de postres, los valores corresponden a los precios de los postres. Es posible que desee ordenar el diccionario por precios, ya sea en orden creciente o decreciente.

▶️ Puede usar el método de diccionario integrado .items() para obtener todos los pares clave-valor. Cada tupla es un par clave-valor.

desserts.items()

dict_items([('Ice cream', 10), ('Brownies', 12), ('Cheesecake', 3), 
('Swiss roll', 5), ('Cookies', 4), ('Cup cake', 2)])

Cada uno de los elementos es una tupla en sí mismo. Por lo tanto, también puede indexar cada par clave-valor para acceder a las claves y valores individualmente.

dict_items = desserts.items()
for item in dict_items:
  print(f"key:{item[0]},value:{item[1]}")

# Output
key:Ice cream,value:10
key:Brownies,value:12
key:Cheesecake,value:3
key:Swiss roll,value:5
key:Cookies,value:4
key:Cup cake,value:2

Como nos gustaría ordenar por valores, usaremos el método anterior para obtener el valor en el índice 1 en el par clave-valor.

Cómo ordenar los valores de un diccionario de Python en orden creciente

Esta vez, usaremos la función sorted() junto con el parámetro clave opcional. La clave puede ser cualquier función de Python, una función integrada, una función definida por el usuario o incluso una función lambda.

Nota: lambda args: expresión es la sintaxis para definir funciones lambda en Python.

En este ejemplo de clasificación de postres por precio, tenemos acceso a elementos del diccionario (pares clave-valor). Estableceremos key = lambda item:item[1] como nos gustaría ordenar por el valor (precio).

Como la función sorted() devuelve una lista de forma predeterminada, debe convertirla explícitamente en un dictado, como se muestra a continuación.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1]))
print(sorted_desserts)

{'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 
'Ice cream': 10, 'Brownies': 12}

También puede reescribir usando comprensión del diccionariocomo se discutió anteriormente.

sorted_desserts = {key:value for key, value in sorted(desserts.items(), 
key=lambda item:item[1])}

print(sorted_desserts)

# Output
{'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 
'Ice cream': 10, 'Brownies': 12}

En sorted_desserts, Cup Cake con un precio de $2 es el primer artículo y Brownies con un precio de $12 es el último artículo.

Cómo ordenar los valores de un diccionario de Python en orden decreciente

Si desea ordenar los precios en orden decreciente, puede establecer el parámetro inverso opcional en Verdadero, como se explica a continuación.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1], 
reverse=True))
print(sorted_desserts)

# Output
{'Brownies': 12, 'Ice cream': 10, 'Swiss roll': 5, 'Cookies': 4, 
'Cheesecake': 3, 'Cup cake': 2}

Ahora, sorted_desserts se ha clasificado en orden decreciente de precios, comenzando con el postre más caro Brownies que cuesta $12.

Terminando 👩🏽‍💻

Resumamos rápidamente todo lo que hemos aprendido en este tutorial.

  • Un diccionario de Python almacena datos en pares clave-valor; todas las claves deben ser únicas.
  • En el proceso de ordenar un diccionario por clave o valor, creamos un nuevo diccionario que se ordena según sea necesario.
  • Puede usar los métodos de diccionario incorporados, .keys() y .items() para recuperar todas las claves y pares clave-valor, respectivamente.
  • Puede usar la función sorted() junto con la tecla de parámetros opcionales e invertir para lograr la clasificación deseada.

Ahora que ha aprendido a ordenar un diccionario de Python, aprenda a ordenar listas de Python. ¡Feliz codificación!🎉