Comprensiones de Python

Las Comprensiones de Listas son un tipo especial de sintaxis que nos permite crear listas a partir de otras listas, y son increíblemente útiles cuando se trabaja con números y con uno o dos niveles de bucles for anidados.

Del tutorial de Python 3 aquí

Las comprensiones de listas proporcionan una forma concisa de crear listas. [...] o para crear una subsecuencia de aquellos elementos que satisfacen una cierta condición.

Lea Comprensiones de Python: Una introducción paso a paso para una introducción más profunda.

Comprensión de listas

Así es como creamos una nueva lista a partir de una colección existente con un Bucle For:

# Enfoque tradicional: crear lista usando un bucle for
names = ['Charles', 'Susan', 'Patrick', 'George']

new_list = []
for n in names:
    new_list.append(n)

new_list
['Charles', 'Susan', 'Patrick', 'George']

Y así es como hacemos lo mismo con una Comprensión de Listas:

# Comprensión de listas: forma concisa de crear una nueva lista
# Sintaxis: [expresión for elemento in iterable]
names = ['Charles', 'Susan', 'Patrick', 'George']

new_list = [n for n in names]  # Crear lista con todos los nombres
new_list
['Charles', 'Susan', 'Patrick', 'George']
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Cuál es la sintaxis básica de una comprensión de listas?
A. [expresión for elemento in iterable]
B. (expresión for elemento in iterable)
C. {expresión for elemento in iterable}
D. expresión for elemento in iterable

Podemos hacer lo mismo con números:

# Comprensión de lista anidada: crear tuplas a partir de dos rangos
# Equivalente a bucles for anidados
n = [(a, b) for a in range(1, 3) for b in range(1, 3)]
n
[(1, 1), (1, 2), (2, 1), (2, 2)]

Añadir condicionales

Si queremos que new_list contenga solo los nombres que comienzan con C, con un bucle for, lo haríamos así:

# Enfoque tradicional: filtrar con condición if
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']

new_list = []
for n in names:
    if n.startswith('C'):  # Filtrar nombres que comienzan con 'C'
        new_list.append(n)

print(new_list)
['Charles', 'Carol']

En una Comprensión de Listas, añadimos la sentencia if al final:

# Comprensión de listas con condición: filtrar elementos
# Sintaxis: [expresión for elemento in iterable if condición]
new_list = [n for n in names if n.startswith('C')]
print(new_list)
['Charles', 'Carol']
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Dónde va la condición if en una comprensión de listas?
A. Antes de la palabra clave for
B. Después de la cláusula for
C. Dentro de la expresión
D. Antes de los corchetes

Para usar una sentencia if-else en una Comprensión de Listas:

# Comprensión de listas con if-else: expresión condicional
# Sintaxis: [expresión_si_verdadero if condición else expresión_si_falso for elemento in iterable]
nums = [1, 2, 3, 4, 5, 6]
new_list = [num*2 if num % 2 == 0 else num for num in nums]  # Duplicar números pares
print(new_list)
[1, 4, 3, 8, 5, 12]

Comprensiones de conjuntos y diccionarios

Los conceptos básicos de las comprensiones de `list` también se aplican a los conjuntos y diccionarios.

Comprensión de conjuntos

# Comprensión de conjuntos: crear un conjunto usando sintaxis de comprensión
# Sintaxis: {expresión for elemento in iterable}
b = {"abc", "def"}
{s.upper() for s in b}  # Convertir todas las cadenas a mayúsculas
{"ABC", "DEF"}

Comprensión de diccionarios

# Comprensión de diccionarios: intercambiar claves y valores
# Sintaxis: {expresión_clave: expresión_valor for elemento in iterable}
c = {'name': 'Pooka', 'age': 5}
{v: k for k, v in c.items()}  # Invertir pares clave-valor
{'Pooka': 'name', 5: 'age'}
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué sintaxis se utiliza para las comprensiones de diccionarios?
A. [clave: valor for elemento in iterable]
B. (clave: valor for elemento in iterable)
C. {expresión_clave: expresión_valor for elemento in iterable}
D. {clave, valor for elemento in iterable}

Se puede generar una comprensión de listas a partir de un diccionario:

# Comprensión de listas a partir de un diccionario: crear cadenas formateadas
c = {'name': 'Pooka', 'age': 5}
["{}:{}".format(k.upper(), v) for k, v in c.items()]  # Formatear como "CLAVE:valor"
['NAME:Pooka', 'AGE:5']

Enlaces relevantes