Comprensiones en Python: List, Dict y Set Comprehension Explicados

👤 Admin 📅 6 de noviembre, 2025 ⏱ 14 min 🏷 Python Intermedio

¿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ápida

Ejemplos 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.