Ordenar Diccionario por Valor en Python – Cómo Ordenar un Dict

Estimated read time 7 min read

En Python, un diccionario es una estructura gruesa que no está ordenada por defecto. Así que, a veces, querrás ordenar diccionarios por clave o valor para facilitar las consultas.

El problema es que ordenar un diccionario por valor nunca es sencillo. Eso es porque Python no tiene un método incorporado para hacerlo.

Sin embargo, he descubierto una manera de ordenar diccionarios por valor, y eso es lo que voy a mostrarte cómo hacer en este artículo.

Cómo ordenar datos con el método sorted()

El método sorted() ordena datos iterables como listas, tuplas y diccionarios. Pero sólo ordena por clave.

El método sorted() coloca los elementos ordenados en una lista. Ese es otro problema que tenemos que resolver, porque queremos que el diccionario ordenado siga siendo un diccionario.

Por ejemplo, sorted() ordenó la lista de abajo en orden alfabético:

persons = ['Chris', 'Amber', 'David', 'El-dorado', 'Brad', 'Folake']
sortedPersons = sorted(persons)

print(sortedPersons)
# Output: ['Amber', 'Brad', 'Chris', 'David', 'El-dorado', 'Folake']

Y el método sorted() ordena los números de la tupla de abajo en orden ascendente:

numbers = (14, 3, 1, 4, 2, 9, 8, 10, 13, 12)
sortedNumbers = sorted(numbers)

print(sortedNumbers)
# Output: [1, 2, 3, 4, 8, 9, 10, 12, 13, 14]

Si utiliza el método sorted() con un diccionario, sólo se devolverán las claves y, como es habitual, estará en una lista:

my_dict = { 'num6': 6, 'num3': 3, 'num2': 2, 'num4': 4, 'num1': 1, 'num5': 5}
sortedDict = sorted(my_dict)

print(sortedDict)
# ['num1', 'num2', 'num3', 'num4', 'num5', 'num6']

Este no es el comportamiento que desea. Quieres que el diccionario se ordene por valor y siga siendo un diccionario. Eso es lo que te voy a mostrar a continuación.

Cómo funciona el método sorted()

Para ordenar un diccionario, vamos a seguir utilizando la función sorted, pero de una forma más complicada. No te preocupes, te explicaré todo lo que necesitas saber.

Ya que vamos a seguir utilizando el método sorted(), es hora de explicar el método sorted() en detalle.

Parámetros del método sorted()

El método sorted() puede aceptar hasta 3 parámetros:

  • iterable – los datos sobre los que iterar. Puede ser una tupla, una lista o un diccionario.
  • key – un valor opcional, la función que le ayuda a realizar una operación de ordenación personalizada.
  • reverse – otro valor opcional. Le ayuda a ordenar los datos en orden ascendente o descendente.

Si adivinaste bien, el parámetro key es lo que pasaremos al método sorted() para obtener el diccionario ordenado por valor.

Ahora, es el momento de ordenar nuestro diccionario por valor y asegurarnos de que sigue siendo un diccionario.

Cómo ordenar un diccionario con el método sorted()

Para ordenar correctamente un diccionario por valor con el método sorted(), tendrá que hacer lo siguiente:

  • pasar el diccionario al método sorted() como primer valor
  • utilizar el método items() en el diccionario para recuperar sus claves y valores
  • escriba una función lambda para obtener los valores recuperados con el método item()

He aquí un ejemplo:

footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}

sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
print(sorted_footballers_by_goals)

Como dije antes, tenemos que obtener esos valores del diccionario para poder ordenar el diccionario por valores. Por eso puedes ver 1 en la función lambda.

1 representa los índices de los valores. Las claves son 0. Recuerda que un programador empieza a contar desde 0, no desde 1.

Con ese código de arriba, obtuve el resultado de abajo:

# [('Cruyff', 104), ('Eusebio', 120), ('Messi', 125), ('Ronaldo', 132), ('Pele', 150)]

Aquí está el código completo para que no te confundas:

footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}

sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
print(sorted_footballers_by_goals)

# [('Cruyff', 104), ('Eusebio', 120), ('Messi', 125), ('Ronaldo', 132), ('Pele', 150)]

Puede ver que el diccionario se ha ordenado por valores en orden ascendente. También se puede ordenar en orden descendente. Pero eso lo veremos más adelante porque todavía tenemos un problema con el resultado que obtuvimos.

El problema es que el diccionario ya no es un diccionario. Las claves y valores individuales se pusieron en una tupla y luego se condensaron en una lista. Recuerda que cualquier cosa que obtengas como resultado del método sorted() se pone en una lista.

Hemos sido capaces de ordenar los elementos del diccionario por valor. Lo que queda es convertirlo de nuevo en un diccionario.

Cómo convertir la lista resultante en un diccionario

Para convertir la lista resultante en un diccionario, no necesita escribir otra función complicada o un bucle. Basta con pasar la variable que guarda la lista resultante al método dict().

converted_dict = dict(sorted_footballers_by_goals)
print(converted_dict)
# Output: {'Cruyff': 104, 'Eusebio': 120, 'Messi': 125, 'Ronaldo': 132, 'Pele': 150}

Recuerda que guardamos el diccionario ordenado en la variable llamada sorted_footballers_by_goals, por lo que es la variable que tenemos que pasar a dict().

El código completo tiene este aspecto:

footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}

sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1])
converted_dict = dict(sorted_footballers_by_goals)

print(converted_dict)
# Output: {'Cruyff': 104, 'Eusebio': 120, 'Messi': 125, 'Ronaldo': 132, 'Pele': 150}

Ya está. Hemos podido ordenar los elementos del diccionario y convertirlos de nuevo en un diccionario. Acabamos de comernos el pastel.

Cómo ordenar el diccionario por valor en orden ascendente o descendente

Recuerde que el método sorted() acepta un tercer valor llamado reverse.

reverse con un valor de True ordenará el diccionario ordenado en orden descendente.

footballers_goals = {'Eusebio': 120, 'Cruyff': 104, 'Pele': 150, 'Ronaldo': 132, 'Messi': 125}

sorted_footballers_by_goals = sorted(footballers_goals.items(), key=lambda x:x[1], reverse=True)
converted_dict = dict(sorted_footballers_by_goals)

print(converted_dict)
# Output: {'Pele': 150, 'Ronaldo': 132, 'Messi': 125, 'Eusebio': 120, 'Cruyff': 104}

Puede ver que la salida está invertida porque pasamos reverse=True al método sorted().

Si no estableces reverse en absoluto o estableces su valor a false, el diccionario se ordenará en orden ascendente. Ese es el valor por defecto.

Conclusión

Enhorabuena. Ahora puedes ordenar un diccionario por valor a pesar de no tener un método o función incorporada para usar en Python.

Sin embargo, hay algo que despertó mi curiosidad cuando me disponía a escribir este artículo. Recuerda que podíamos usar sorted() directamente sobre un diccionario. Esto nos daba como resultado una lista, aunque sólo obteníamos las claves y no los valores.

¿Qué pasa si convertimos esa lista en un diccionario con el método dict()? ¿Crees que podemos obtener el resultado deseado? Veámoslo:

my_dict = { 'num6': 6, 'num3': 3, 'num2': 2, 'num4': 4, 'num1': 1, 'num5': 5}
sortedDict = sorted(my_dict)

converted_dict = dict(sortedDict)
print(converted_dict)
"""
Output: 
dict_by_value.py
Traceback (most recent call last):
  File "sort_dict_by_value.py", line 17, in <module>
    converted_dict = dict(sortedDict)
ValueError: dictionary update sequence element #0 has length 4; 2 is required
"""

Tenemos un error. Eso es porque si quieres crear un diccionario a partir de una lista, tienes que usar la comprensión de diccionario. Y si utilizas la comprensión de diccionario para este tipo de datos, tendrías que especificar un valor para todas las entradas. Eso desafiaría el propósito de ordenar un diccionario por valor, así que no es lo que queremos.

También le puede gustar

Más del autor

+ There are no comments

Add yours