Pregunta 1¿Qué imprime este código?nums = [1, 2, 3, 4]
result = [n * 10 for n in nums]
print(result)
Comprensiones de listas y expresiones de dict / set / generator — Construye colecciones en una línea
Aprende a construir colecciones en una línea con comprensiones de lista, dict, set y expresiones generadoras.
En el artículo anterior sobre all() / any(), viste cómo evaluar una colección entera de una sola vez. Esta vez darás un paso más y verás la sintaxis poderosa para construir la propia colección en una sola línea — las comprensiones.
Empezaremos con las comprensiones de lista, añadiremos el filtrado con if, veremos las variantes de dict y set, y terminaremos con la expresión generadora que ahorra memoria.
Fundamentos de la comprensión de lista — Mete un bucle for en una línea
Python tiene una sintaxis de una línea para construir listas: [expresión for variable in iterable]. Esto se llama comprensión de lista.
Es un atajo para el patrón del bucle for que comienza con una lista vacía y llama a append() repetidamente, y brilla cuando quieres aplicar la misma transformación a cada elemento y producir una nueva lista.
[expresión for variable in iterable] produce una nueva lista con cada elemento transformado por la expresión. Es la versión en una línea de escribir un bucle for con append.
# Usando un bucle for
result = []
for price in [100, 250, 480]:
result.append(int(price * 1.1))
print(result) # [110, 275, 528]
# Lo mismo como comprensión de lista
prices = [100, 250, 480]
tax_included = [int(p * 1.1) for p in prices]
print(tax_included) # [110, 275, 528]
# Recopilando longitudes de cadena también en una línea
names = ["Alice", "Bob", "Charlotte"]
lengths = [len(n) for n in names]
print(lengths) # [5, 3, 9]
Filtrar con if — Comprensiones condicionales
Añade if condición después de for y solo los elementos que satisfacen la condición terminan en la nueva lista. La forma es [expresión for variable in iterable if condición].
Escribir la transformación y el filtro en la misma línea es lo que hace concisas a las comprensiones de lista — extraer «solo los elementos que coinciden» se convierte en una línea corta y legible.
if p >= 200 uno por uno. Los elementos True (guardados) terminan en la nueva lista; los elementos False (omitidos) se descartan.# Extrae solo los elementos >= 200
prices = [80, 250, 120, 480, 95]
premium = [p for p in prices if p >= 200]
print(premium) # [250, 480]
# Filtra y transforma al mismo tiempo
discounted = [int(p * 0.9) for p in prices if p >= 200]
print(discounted) # [225, 432] ← 10% de descuento, solo elementos >= 200
# Filtrar y transformar sobre cadenas
names = ["Alice", "Bob", "Charlotte", "Ed"]
long_names = [n.upper() for n in names if len(n) >= 5]
print(long_names) # ['ALICE', 'CHARLOTTE']
Comprensiones de dict y comprensiones de set
Cambia los corchetes [ ] de una comprensión de lista por llaves { } y obtienes una comprensión de conjunto.
Da un paso más con {clave: valor for ...} y los dos puntos lo convierten en una comprensión de diccionario. La sintaxis for ... in ... es idéntica — solo cambia la forma de la colección de salida, y esa flexibilidad es lo que hace tan útiles a las comprensiones.
{clave: valor for ...} construye un dict de pares. A partir de una lista de tuplas (nombre, precio) puedes construir una búsqueda «nombre → precio» en una línea.
# Comprensión de dict: construye una búsqueda nombre → precio
pairs = [("manzana", 120), ("naranja", 80), ("banana", 60)]
price_lookup = {name: price for name, price in pairs}
print(price_lookup)
# {'manzana': 120, 'naranja': 80, 'banana': 60}
# Reconstruye un dict con precios con impuestos incluidos
tax_included = {name: int(price * 1.1) for name, price in pairs}
print(tax_included)
# {'manzana': 132, 'naranja': 88, 'banana': 66}
# Comprensión de set: extrae etiquetas únicas (sin duplicados)
tags = ["sale", "new", "sale", "limited", "new"]
unique = {t for t in tags}
print(unique) # {'sale', 'new', 'limited'} (el orden depende de la implementación)
Combina zip() con comprensiones de dict
Cuando tienes dos listas paralelas como names y prices y quieres un dict, {n: p for n, p in zip(names, prices)} encaja perfectamente. zip() recorre las listas al unísono para que puedas construir las claves y los valores al mismo tiempo.
Expresiones generadoras — Cambia los corchetes por paréntesis
Cambia los corchetes [ ] de una comprensión de lista por paréntesis ( ) y tienes una expresión generadora. A diferencia de una lista, no materializa todos los elementos en memoria — calcula solo lo que necesitas, cuando lo necesitas (evaluación perezosa).
Puedes pasarla directamente a sum() / max() / min() / any(), lo que mantiene bajo el uso de memoria al agregar grandes cantidades de datos. La explicación detallada está en el artículo sobre funciones generadoras más adelante.
| Sintaxis | Tipo resultado | Característica |
|---|---|---|
| [x for x in items] | list | Conserva todo en memoria |
| {x for x in items} | set | Sin duplicados, todo en memoria |
| {k: v for k, v in items} | dict | Pares clave: valor, todo en memoria |
| (x for x in items) | generator | Solo el elemento actual, lazy |
# Los paréntesis crean una expresión generadora
prices = [100, 250, 480, 1200]
gen = (int(p * 1.1) for p in prices)
print(type(gen)) # <class 'generator'>
# Pásala directamente a sum() (los paréntesis externos pueden omitirse)
total_tax = sum(int(p * 1.1) for p in prices)
print(total_tax) # 2233
# El mismo truco con max() / min()
max_tax = max(int(p * 1.1) for p in prices)
print(max_tax) # 1320
Elige según el caso de uso: ¿«todo a la vez» o «uno a la vez»?
Si quieres toda la cosa como una lista en la mano, usa [ ] (comprensión de lista). Si solo estás pasándolo a sum() / max() para agregar, ( ) (expresión generadora) es la elección más amigable con la memoria. A escala de un millón de elementos la diferencia es dramática — la expresión generadora usa solo unos pocos cientos de bytes.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué imprime este código?nums = [1, 2, 3, 4, 5]
result = [n for n in nums if n % 2 == 0]
print(result)
Pregunta 3¿Cuál de estas crea un dict?