Comprensión de listas en Python: guía

Comprensión de listas en Python: guía

Una comprensión de listas en Python crea una lista a partir de un iterable con una expresión compacta. Permite transformar y filtrar datos sin separar la lógica en varias líneas, siempre que el resultado continúe siendo fácil de leer.

Sintaxis básica

resultado = [expresion for elemento in iterable]

Ejemplo:

cuadrados = [numero ** 2 for numero in range(1, 6)]
# [1, 4, 9, 16, 25]

Equivale a:

cuadrados = []
for numero in range(1, 6):
    cuadrados.append(numero ** 2)

La comprensión expresa qué lista se construye; el bucle explícito facilita depuración y pasos múltiples.

Filtrar elementos

pares = [numero for numero in range(20) if numero % 2 == 0]

La condición final decide si el elemento se incluye. No confundas este filtro con una expresión condicional que elige entre dos valores.

if-else dentro de la expresión

etiquetas = [
    "positivo" if valor > 0 else "no positivo"
    for valor in [-2, 0, 4]
]

El condicional va antes de for porque forma parte del valor generado. Puedes combinar un condicional y un filtro, pero si la línea necesita releerse varias veces, conviene un bucle o función con nombre.

Limpiar texto

nombres = ["  Ana ", "", " Luis", None]

limpios = [
    nombre.strip()
    for nombre in nombres
    if isinstance(nombre, str) and nombre.strip()
]

El resultado excluye nulos y cadenas vacías. En un pipeline real quizá necesites conservar la posición y registrar qué valores se descartaron; la concisión no debe borrar trazabilidad.

Comprensiones anidadas

Aplanar una matriz:

matriz = [[1, 2], [3, 4], [5, 6]]
planos = [valor for fila in matriz for valor in fila]

El orden sigue los bucles equivalentes:

for fila in matriz:
    for valor in fila:
        ...

Para estructuras más profundas o reglas complejas, usa una función recursiva o herramientas especializadas. Una comprensión de tres o cuatro niveles suele perjudicar mantenimiento.

Diccionarios y conjuntos

precios = {"A": 100, "B": 80}

con_iva = {
    producto: precio * 1.16
    for producto, precio in precios.items()
}

iniciales = {nombre[0] for nombre in ["Ana", "Alma", "Luis"]}

Las comprensiones de conjunto eliminan repetidos según igualdad; las de diccionario requieren claves únicas y el último valor sobrescribe coincidencias anteriores.

Generador frente a lista

cuadrados_lista = [x * x for x in range(1_000_000)]
cuadrados_gen = (x * x for x in range(1_000_000))

La lista materializa todos los valores; el generador los produce a demanda. Si solo vas a sumar:

total = sum(x * x for x in range(1_000_000))

El generador reduce memoria y solo puede recorrerse una vez. Elige lista si necesitas indexar, reutilizar o conocer todos los valores.

Comprensiones y pandas

Para un DataFrame, una comprensión sobre filas rara vez es la primera opción. pandas y NumPy ofrecen operaciones vectorizadas:

df["total"] = df["cantidad"] * df["precio"]

Esto suele ser más rápido y conserva el índice. Usa comprensiones para construir listas de columnas, configuraciones o objetos Python, no para reemplazar sin necesidad las capacidades de pandas.

Efectos secundarios

Evita:

[guardar(x) for x in elementos]

La comprensión crea una lista que no necesitas y oculta el efecto. Un bucle comunica mejor:

for elemento in elementos:
    guardar(elemento)

Legibilidad y estilo

Una comprensión es buena cuando:

  • produce una colección;
  • contiene una transformación breve;
  • tiene como máximo un filtro sencillo;
  • los nombres explican el dominio;
  • no genera efectos secundarios.

Usa un bucle cuando necesitas manejo de errores, varias asignaciones, registros, break, continue o condiciones anidadas.

Errores frecuentes

  • Usar una comprensión solo para ejecutar funciones.
  • Anidar demasiados for.
  • Confundir filtro con if-else.
  • Materializar millones de elementos innecesarios.
  • Ignorar excepciones dentro de la expresión.
  • Repetir un cálculo costoso en la condición y en el resultado.
  • Ocultar una regla de negocio compleja en una sola línea.

Para probar ejemplos de forma aislada, un Jupyter Notebook o un entorno reproducible ayuda a comparar resultados y consumo de memoria.

Preguntas frecuentes

¿Qué es una list comprehension?
Es una sintaxis para construir una lista mediante una expresión, un iterable y, opcionalmente, un filtro.

¿Dónde va el if en una comprensión?
El filtro va después del for; un if-else que elige el valor va antes del for.

¿Una comprensión siempre es más rápida?
Suele evitar parte de la sobrecarga de un bucle con append, pero la legibilidad y el algoritmo importan más. Mide si es crítico.

¿Cuál es la diferencia con un generador?
Los corchetes crean toda la lista; los paréntesis producen valores a demanda y consumen menos memoria.

¿Puedo crear diccionarios por comprensión?
Sí, con la forma {clave: valor for elemento in iterable}. Vigila claves repetidas.

¿Debo usar comprensiones con DataFrames?
Para cálculos por columna, prefiere operaciones vectorizadas de pandas o NumPy. Úsalas cuando realmente construyas objetos Python.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir