8.1. Comprensiones en Python#
Las comprensiones (comprehensions
) son expresiones declarativas que permiten construir colecciones de forma concisa y legible. Usan la semántica de expresión de Python para crear listas, diccionarios, sets o generadores, sin necesidad de escribir bucles explícitos.
Es decir, en lugar de esto:
new_list = []
for item in my_list:
item += 10
new_list.append(item)
Usando comprensiones, se transforma en:
new_list = [item+10 for item in my_list]
Se consideran una herramienta idiomática y deben usarse cuando mejoran la expresividad del código, sin comprometer su legibilidad.
8.1.1. Comprensión de listas#
La forma más común. Genera una lista a partir de un iterable aplicando una transformación opcional y un filtro.
[x * 2 for x in range(5)] # [0, 2, 4, 6, 8]
También puede incluir condicionales:
[x for x in range(10) if x % 2 == 0] # pares
8.1.2. Comprensión de diccionarios#
Permite construir diccionarios usando la misma lógica declarativa.
{x: x ** 2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Con un iterable de pares clave-valor:
pares = [("a", 1), ("b", 2), ("c", 3)]
{clave: valor for clave, valor in pares}
También es útil para invertir diccionarios:
d = {"uno": 1, "dos": 2, "tres": 3, "cuatro": 4}
{v: k for k, v in d.items() if v%2 == 0} # solo pares
8.1.3. Generadores#
En lugar de crear una colección en memoria, genera un iterador perezoso (lazy) que produce elementos a demanda.
Nota
A diferencia de las listas y las tuplas que tienen todos sus valores cargados en la memoria, los generadores solo tienen en la memoria el valor que se extrae en el momento. Se obtienen los valores deseados a demanda del programa.
(x ** 2 for x in range(10))
Advertencia
Nota que al usar paréntesis no se genera una tupla sino un generador
Combinado con funciones agregadas:
sum(x for x in range(1000) if x % 5 == 0) # solo suma los múltiplos de 5
Esto es más eficiente en memoria para flujos de datos grandes.
8.1.4. Consideraciones de estilo y rendimiento#
Las comprensiones son más rápidas que los bucles tradicionales en estructuras pequeñas o medianas.
No anides comprensiones más allá de dos niveles.
Prefiere expresiones generadoras cuando no necesitas almacenar toda la secuencia en memoria.
8.1.5. Ejemplos idiomáticos#
8.1.5.1. Extraer claves por condición:#
[k for k, v in dic.items() if v is not None]
8.1.5.2. Flattening (una dimensión):#
[x for fila in matriz for x in fila]
8.1.5.3. Conteo condicional:#
sum(1 for x in data if x > 0)
8.1.6. Conclusión#
Las comprensiones son una de las características que distinguen a Python como lenguaje expresivo. Su uso correcto promueve un estilo más funcional, claro y eficiente.
Tip profesional
Si una comprensión no cabe cómodamente en una línea o requiere más de un if
, considera usar una función auxiliar o un bucle explícito.