Artículo original escrito por Bala Priya C
Artículo original https://www.freecodecamp.org/news/dictionary-comprehension-in-python-explained-with-examples/
Traducido y adaptado por andres-torres

Los diccionarios son poderosas estructuras de datos en Python que almacenan datos como pares de claves, siendo esta representada en la siguiente forma: Clave-Valor. La comprensión de diccionarios (o dict comprehension) puede ser muy útil en crear nuevos diccionarios basados en diccionarios existentes e iterables.

En este tutorial, aprenderemos cómo funcionan los diccionarios por comprensión , añadiendo algunos ejemplos de código.

¿Qué es un diccionario en Python?

Los diccionarios en Python nos permiten almacenar una serie de mapeos entre dos conjuntos de elementos, llamados keys and values (Claves y Valores).

  • Todos los elementos en el diccionario se encuentran encerrados en un par de corchetes {}.
  • Cada elemento en un diccionario contiene una clave y un valor - es decir un par de clave-valor.
  • Cada par de clave-valor es denominado como elemento (item).
  • La ventaja de esto es que puedes acceder a todos los valores almacenados usando simplemente las claves.

He aquí un ejemplo de la estructura pertinente a un diccionario:

mi_diccionario = {"key1":<value1>,"key2":<value2>,"key3":<value3>,"key4":<value4>}

En el ejemplo anterior,

  • El diccionario mi_diccionario contiene cuatro pares de clave-valor, es decir, cuatro elementos.
  • "key1" hasta "key4" son las cuatro claves.
  • Puedes usar mi_diccionario["key1"] para acceder a <value1>, y mi_diccionario["key2"] para acceder a <value2>, y así sucesivamente.

¿Aún tienes dudas?

No te preocupes, agreguemos un ejemplo más práctico.

#Cómo verás, los nombres de los participantes son las Key, mientras que sus respectivos puntajes, son los Value.

prueba_deportiva={'Jorge':500,'Diana':600,'Rodrigo':800,'Julia':750,'Li':900}

#simplifiquemos la definición de la variable

nota=prueba_deportiva

#Ahora llamaremos al tercer elemento key-value, es decir, al tercer Item
print(nota['Rodrigo'])

#Hagamos lo mismo con el quinto Item
print(nota['Li'])

# Haz el intento, los resultados serán 800 y 900 respectivamente, es decir, los valores de cada key.

Ahora que sabemos qué es un diccionario en Python, veamos qué es la comprensión de diccionario, Dictionary Comprehension.

Cómo usar la Compresión de diccionario para crear un diccionario de Python a partir de una iteración.

En esta sección, usaremos la compresión de diccionario para crear un diccionario en Python a partir de un elemento iterable, es decir, una lista o tupla.

Podemos crear un nuevo diccionario en Python usando solamente un iterable si elegimos generar ya sea las claves o los valores en marcha.

Cuando elegimos generar los valores en cuestión, podemos usar los ítems en el iterable cómo claves, y viceversa.

La sintaxis general es mostrada abajo. Por favor, observa que los nombres entre <> son marcadores de posición para los nombres actuales de las variables.

<nombre_diccionario> = {<new_key>:<new_value> for <item> in <iterable>}

Analicemos la sintaxis anterior.

  • {} indica que estamos definiendo un diccionario.
  • Para cada elemento del iterable, generamos un par de clave-valor en el diccionario.

▶ Es tiempo de un ejemplo rápido.

Comprensión de diccionario en Python - Ejemplo 1

Supongamos que tenemos una lista de clientes que visitan nuestra tienda, y nos gustaría ofrecer un descuento aleatorio a cada cliente. Nos gustaría además, que el valor de descuento se encuentre entre $1 y $100.

En Python, random.randint(i,j) retorna un valor entre i y j incluyendo ambos extremos.

Por tanto, podemos utilizar la función randint() para generar un descuento entre   $1 y $100 para cada cliente en la lista.

El siguiente código nos mostrará cómo podemos crear un diccionario de descuentos a partir de la lista de clientes.

import random
clientes = ["Alex","Bob","Carol","Dave","Flow","Katie","Nate"]
diccionario_descuentos = {cliente:random.randint(1,100) for cliente in clientes}
print(diccionario_descuentos)
#Resultado

{'Alex': 16, 'Bob': 26, 'Carol': 83, 'Dave': 21, 'Flow': 38, 'Katie': 47, 'Nate': 89}

El funcionamiento del ejemplo anterior es el siguiente:

  • Una iteración a través de la lista de clientes.
  • Usa el nombre de cada cliente cómo clave.
  • Genera un descuento aleatorio entre  $1 y $100 como el valor complementario a cada clave.

Cómo usar la comprensión de diccionarios para crear un diccionario con a partir de dos iterables.

¿Qué pasa si tenemos iterables predefinidos que contengan las claves y valores? Por ejemplo, tenemos dos listas, lista_1 y lista_2 – con lista_1 conteniendo las claves y lista_2 conteniendo los correspondientes valores.

Ahora podemos usar la función zip() para comprimir estas dos listas, llegando a generar los pares de clave-valor (es decir, los elementos de estas dos listas).

Observación: La función zip toma una secuencia de iterables, cómo el argumento y retorna un iterador de tuplas, tal y como se muestra en la imagen siguiente.
image-95

En la imagen se muestra que la primera tupla es el primer par de clave-valor, la segunda tupla, el segundo par de clave-valor, y en general, la tupla n-i es el n-i par clave-valor.

Cómo ya hemos mencionado anteriormente, los pares de clave-valor son la combinación de las claves y los valores, constituyendo cada par, un elemento en el diccionario.

En este caso, la comprensión del diccionario toma la siguiente forma:

<nombre_diccionario> = {<new_key>:<new_value> for (key,value) in zip(list1,list2)}

Analizar la sintaxis anterior es bastante simple:

  • Las claves y valores están disponibles cómo tuplas, ya que las hemos comprimido juntas usando la función zip().
  • Ahora, ejecutamos el bucle a través del iterador de tuplas para obtener los pares de clave-valor de nuestro diccionario.

▶ Es hora de otros ejemplos.

Comprensión de diccionario en Python  - Ejemplo 2

Esta vez, supongamos que nos gustaría crear un diccionario que contenga información sobre el clima semanal en nuestra ciudad. Los días (en inglés) serían las claves, mientras que las temperaturas (en grados Celsius) sus correspondientes valores.

Tenemos los días y su temperatura en dos listas, tal y como se muestra a continuación.

dias =["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
temp = [30.5,32.6,31.8,33.4,29.8,30.2,29.9]

¿Cómo usamos la comprensión de diccionario con estas dos listas, para crear un diccionario de temperaturas semanales? Procedamos:

# Creando un diccionario de temperaturas semanales
# A partir de dos listas aisladas

temp_semanal = {dias:temp for (dias,temp) in zip(dias,temp)}

print(temp_semanal)

#Resultado
{'Sunday': 30.5, 'Monday': 32.6, 'Tuesday': 31.8, 'Wednesday': 33.4, 'Thursday': 29.8, 'Friday': 30.2, 'Saturday': 29.9}

En el ejemplo anterior usamos la función zip() para comprimir las dos listas. Ahora podemos buscar en el diccionario valores a través de las claves:

temp_semanal["Thursday"]
# Resultado
29.8

Cómo usar el método de items() en un diccionario de Python.

Anteriormente, hemos visto cómo usar las claves para acceder a los valores. ¿Pero cómo podemos acceder a todos los pares de clave-valor en un diccionario?

Para hacer esto, hacemos uso del método items()  en el diccionario para obtener todos los pares de clave-valor.

diccionario_descuentos.items()

# Output
dict_items([('Alex', 16), ('Bob', 26), ('Carol', 83), ('Dave', 21), ('Flow', 38), ('Katie', 47), ('Nate', 89)])

Cómo usar la comprensión de diccionarios para crear un diccionario de Python a partir de un diccionario existente.

Ahora miremos el caso en el que ya tengamos un diccionario en Python. ?

Sin embargo, nos gustaría crear un nuevo diccionario que contenga solo los elementos de nuestro diccionario existente, que satisfagan una condición particular.

<nombre_diccionario> = {<new_key>:<new_value> for (key,value) in <dict>.items() if <condition>}

Expliquemos la sintaxis. Usamos el método items() y obtenemos todos los pares de clave-valor en el diccionario existente.

  • Accedemos al primer ítem del diccionario, verificando si nuestra condición condition es evaluada cómo verdadera True.
  • Si la condición es True, añadimos el primer ítem a nuestro diccionario.
  • Por último solo queda repetir estos pasos para todos los elementos de nuestro diccionario existente de forma sucesiva.

▶ Veamos un ejemplo.

Comprensión de diccionario en Python - Ejemplo 3

Recordemos nuestro anterior ejemplo del diccionario de descuentos

{'Alex': 16, 'Bob': 26, 'Carol': 83, 'Dave': 21, 'Flow': 38, 'Katie': 47, 'Nate': 89}

Vemos que alguna parte de la clientela tuvo suerte en obtener un descuento mayor que otros. Veamos detrás de esta disparidad y hagamos a toda nuestra clientela feliz. ?

Nos gustaría ofrecer a las personas que han tenido menos de $30 de descuento, un  10% de descuento en su próxima compra. ✨

En este caso, estamos creando un nuevo diccionario clientela_10 a partir de nuestro diccionario_descuentos.

clientela_10 = {cliente:descuento for (cliente, descuento) in diccionario_descuentos.items() if descuento<30}

print(clientela_10)

# Output
{'Alex': 16, 'Bob': 26, 'Dave': 21}

El código de arriba explica lo siguiente:

  • Por cada uno de los elementos en nuestrodiccionario_descuentos, se evalúa el valor del descuento.
  • Si el descuento aplicado fue menor a $30, se añade el correspondiente descuento en conjunción con nuestro nuevo diccionario  clientela_10.

Son Alex, Bob, y Dave quienes obtuvieron menos de $30 en descuentos, quienes han sido añadidos al nuevo diccionario.

Conclusión

Resumamos lo aprendido en este tutorial. Hemos visto cómo usar la comprensión de diccionario, creando nuevos diccionarios en Python. Siendo a partir de:

  • un solo iterable,
  • dos iterables, y
  • un diccionario existente usando condicionales para filtrar a través de los elementos.

Muchas Gracias por Leer y Feliz Aprendizaje.?