¿Qué son las Comprensiones?
Las comprensiones (comprehensions) son una forma concisa y elegante de crear listas, diccionarios, sets y generadores en Python. Son más rápidas y legibles que los bucles tradicionales.
List Comprehension
Sintaxis Básica
# Forma tradicional con bucle
cuadrados = []
for i in range(10):
cuadrados.append(i ** 2)
print(cuadrados)
# List comprehension (más elegante)
cuadrados = [i ** 2 for i in range(10)]
print(cuadrados) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Con Condicional (if)
# Solo números pares
pares = [i for i in range(20) if i % 2 == 0]
print(pares) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# Solo números positivos
numeros = [-5, -2, 0, 3, 7, -1, 8]
positivos = [n for n in numeros if n > 0]
print(positivos) # [3, 7, 8]
# Palabras largas
palabras = ["python", "es", "genial", "y", "poderoso"]
largas = [p for p in palabras if len(p) > 3]
print(largas) # ['python', 'genial', 'poderoso']Con if-else
# Par o impar
numeros = [1, 2, 3, 4, 5]
tipo = ["par" if n % 2 == 0 else "impar" for n in numeros]
print(tipo) # ['impar', 'par', 'impar', 'par', 'impar']
# Clasificar temperaturas
temperaturas = [15, 25, 30, 10, 35]
clasificacion = ["frío" if t < 20 else "cálido" for t in temperaturas]
print(clasificacion)Comprensiones Anidadas
# Aplanar lista de listas
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
aplastada = [num for fila in matriz for num in fila]
print(aplastada) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Combinaciones
colores = ['rojo', 'verde', 'azul']
objetos = ['casa', 'auto']
combinaciones = [f"{color} {objeto}" for color in colores for objeto in objetos]
print(combinaciones)
# ['rojo casa', 'rojo auto', 'verde casa', 'verde auto', 'azul casa', 'azul auto']
# Tabla de multiplicar
tabla = [[i * j for j in range(1, 6)] for i in range(1, 6)]
for fila in tabla:
print(fila)Ejemplos Prácticos de List Comprehension
1. Transformar Datos
# Convertir a mayúsculas
nombres = ["ana", "luis", "maría"]
mayusculas = [nombre.upper() for nombre in nombres]
print(mayusculas) # ['ANA', 'LUIS', 'MARÍA']
# Extraer dominios de emails
emails = ["ana@gmail.com", "luis@yahoo.com", "maria@hotmail.com"]
dominios = [email.split('@')[1] for email in emails]
print(dominios) # ['gmail.com', 'yahoo.com', 'hotmail.com']2. Filtrar y Transformar
# Obtener longitud de palabras largas
palabras = ["python", "es", "un", "lenguaje", "poderoso"]
longitudes = [len(p) for p in palabras if len(p) > 3]
print(longitudes) # [6, 8, 8]
# Convertir strings a números
strings = ["10", "20", "abc", "30", "xyz"]
numeros = [int(s) for s in strings if s.isdigit()]
print(numeros) # [10, 20, 30]3. Operaciones Matemáticas
# Fahrenheit a Celsius
fahrenheit = [32, 68, 86, 104]
celsius = [(f - 32) * 5/9 for f in fahrenheit]
print(celsius) # [0.0, 20.0, 30.0, 40.0]
# Calcular áreas de círculos
import math
radios = [1, 2, 3, 4, 5]
areas = [math.pi * r**2 for r in radios]
print(areas)Dictionary Comprehension
Sintaxis Básica
# Crear diccionario de cuadrados
cuadrados = {x: x**2 for x in range(6)}
print(cuadrados) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# Desde dos listas
nombres = ['Ana', 'Luis', 'María']
edades = [25, 30, 28]
personas = {nombre: edad for nombre, edad in zip(nombres, edades)}
print(personas) # {'Ana': 25, 'Luis': 30, 'María': 28}Con Condicionales
# Solo números pares
cuadrados_pares = {x: x**2 for x in range(10) if x % 2 == 0}
print(cuadrados_pares) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# Filtrar diccionario existente
notas = {'Ana': 85, 'Luis': 92, 'María': 78, 'Carlos': 95}
aprobados = {nombre: nota for nombre, nota in notas.items() if nota >= 80}
print(aprobados) # {'Ana': 85, 'Luis': 92, 'Carlos': 95}Transformar Diccionarios
# Invertir clave-valor
original = {'a': 1, 'b': 2, 'c': 3}
invertido = {v: k for k, v in original.items()}
print(invertido) # {1: 'a', 2: 'b', 3: 'c'}
# Multiplicar valores
precios = {'manzana': 2, 'pera': 3, 'uva': 5}
con_descuento = {fruta: precio * 0.9 for fruta, precio in precios.items()}
print(con_descuento)
# Convertir claves a mayúsculas
datos = {'nombre': 'Ana', 'edad': 25, 'ciudad': 'Madrid'}
mayusculas = {k.upper(): v for k, v in datos.items()}
print(mayusculas) # {'NOMBRE': 'Ana', 'EDAD': 25, 'CIUDAD': 'Madrid'}Set Comprehension
Sintaxis Básica
# Crear set de cuadrados
cuadrados = {x**2 for x in range(10)}
print(cuadrados) # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# Eliminar duplicados automáticamente
numeros = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unicos = {n for n in numeros}
print(unicos) # {1, 2, 3, 4, 5}Con Condicionales
# Solo vocales únicas
texto = "programacion en python"
vocales = {c for c in texto if c in 'aeiou'}
print(vocales) # {'a', 'e', 'i', 'o'}
# Números pares únicos de múltiples listas
listas = [[1, 2, 3], [2, 3, 4], [4, 5, 6]]
pares_unicos = {n for lista in listas for n in lista if n % 2 == 0}
print(pares_unicos) # {2, 4, 6}Generator Expression
Similar a list comprehension pero usa () y genera valores bajo demanda (más eficiente en memoria):
# List comprehension (crea lista completa en memoria)
lista = [x**2 for x in range(1000000)]
# Generator expression (genera valores uno a uno)
generador = (x**2 for x in range(1000000))
# Usar generador
for i, valor in enumerate(generador):
if i >= 5:
break
print(valor)
# Útil con funciones que aceptan iterables
sum_cuadrados = sum(x**2 for x in range(100))
print(sum_cuadrados)
maximo = max(x**2 for x in range(10))
print(maximo)Comparación de Rendimiento
import time
# Método 1: Bucle tradicional
start = time.time()
resultado = []
for i in range(1000000):
resultado.append(i ** 2)
print(f"Bucle: {time.time() - start:.4f}s")
# Método 2: List comprehension
start = time.time()
resultado = [i ** 2 for i in range(1000000)]
print(f"Comprehension: {time.time() - start:.4f}s")
# Método 3: map()
start = time.time()
resultado = list(map(lambda x: x ** 2, range(1000000)))
print(f"Map: {time.time() - start:.4f}s")
# List comprehension suele ser más rápidaEjemplos Avanzados
1. Procesar Archivos CSV
# Simulación de datos CSV
lineas = [
"nombre,edad,ciudad",
"Ana,25,Madrid",
"Luis,30,Barcelona",
"María,28,Sevilla"
]
# Extraer datos (saltando encabezado)
datos = [linea.split(',') for linea in lineas[1:]]
print(datos)
# Crear diccionarios
encabezados = lineas[0].split(',')
registros = [{encabezados[i]: valor for i, valor in enumerate(linea.split(','))}
for linea in lineas[1:]]
print(registros)2. Procesamiento de Texto
# Contar palabras
texto = "python es genial python es poderoso"
contador = {palabra: texto.split().count(palabra)
for palabra in set(texto.split())}
print(contador)
# Limpiar y normalizar
palabras_sucias = [" Python ", "JAVA", " JavaScript "]
limpias = [p.strip().lower() for p in palabras_sucias]
print(limpias) # ['python', 'java', 'javascript']3. Operaciones con Matrices
# Transponer matriz
matriz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transpuesta = [[fila[i] for fila in matriz] for i in range(len(matriz[0]))]
for fila in transpuesta:
print(fila)
# [1, 4, 7]
# [2, 5, 8]
# [3, 6, 9]4. Validación de Datos
# Validar lista de emails
emails = ["ana@email.com", "invalido", "luis@test.com", "error"]
validos = [email for email in emails if '@' in email and '.' in email]
print(validos) # ['ana@email.com', 'luis@test.com']
# Filtrar números en rango
numeros = [5, 15, 25, 35, 45, 55]
en_rango = [n for n in numeros if 10 <= n <= 40]
print(en_rango) # [15, 25, 35]Cuándo NO Usar Comprensiones
# MAL: Demasiado complejo
# difícil de leer
resultado = [x if x > 0 else -x if x < -10 else 0
for x in range(-20, 20) if x != 0]
# MEJOR: Usar bucle tradicional
resultado = []
for x in range(-20, 20):
if x == 0:
continue
if x > 0:
resultado.append(x)
elif x < -10:
resultado.append(-x)
else:
resultado.append(0)Buenas Prácticas
- Legibilidad primero: Si la comprensión es difícil de leer, usa un bucle
- Una línea preferible: Evita comprensiones muy largas
- Nombres descriptivos: Usa variables con nombres claros
- Usa generator expressions: Para grandes datasets que no necesitas completos
- Evita efectos secundarios: No modifiques variables externas dentro de comprensiones
Conclusión
Las comprensiones son una característica poderosa de Python que permite escribir código más conciso, elegante y a menudo más rápido. Son especialmente útiles para transformar y filtrar colecciones de datos. Sin embargo, recuerda que la legibilidad es más importante que la brevedad.