12 · Comprensiones de lista
Transforma y filtra secuencias en una línea legible — incluyendo una implementación de ReLU en tres tokens.
`[expr for x in iter if cond]` reemplaza un bucle for de 4 líneas con una única expresión declarativa que se lee como prosa: "una lista de *expr* por cada *x* en *iter* donde *cond*".
Sin esto:
Sin comprensiones, cada transformación de características o paso de filtrado requiere 3–4 líneas de for-loop de plantilla — ralentizando el trabajo exploratorio con datos y haciendo los pipelines más difíciles de leer.
Una comprensión de lista es una forma compacta de construir una lista a partir de cualquier iterable. La forma básica [expr for x in iter] aplica expr a cada elemento. Agregar if cond después de la cláusula for actúa como filtro — solo los elementos para los cuales la condición es verdadera terminan en el resultado.
Python (in browser)
La comprensión y el for-loop producen resultados idénticos. La comprensión no es solo más corta — señala *intención*: esto es una transformación pura sin efectos secundarios.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Puedes incrustar una expresión ternaria dentro de una comprensión para mapear valores de forma diferente según una condición. Esto es el equivalente Python de clip de NumPy o de la función de activación de redes neuronales ReLU (Unidad Lineal Rectificada): fija los valores negativos en cero.
Python (in browser)
Observa cómo `[x if x > 0 else 0 for x in activations]` se lee exactamente como la definición matemática de ReLU: "x si x > 0, de lo contrario 0".
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
La expresión de normalización `(x - media) / std` es exactamente la fórmula de puntuación z aplicada elemento a elemento — la misma operación que NumPy hace con `(arr - arr.mean()) / arr.std()`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Lee de afuera hacia adentro: el `for _ in range(rows)` externo itera sobre las filas; el interno construye cada fila. Nota que `[[0] * cols] * rows` sería un error — todas las filas compartirían el mismo objeto lista.
¿Qué devuelve `[x for x in [1, 2, 3] if x > 1]`?
Construye un conjunto de comprensiones en el Arena — transformaciones, filtros y un mini-normalizador de características.
Las comprensiones expresan de forma natural las operaciones elemento a elemento sobre vectores que el capítulo 1 de MML formaliza — la multiplicación escalar, la suma y el mapeo de una función sobre un vector son todas comprensiones de una línea en Python.
- `[expr for x in iter]` transforma cada elemento; `[expr for x in iter if cond]` también filtra. Ambos devuelven una nueva lista.
- Un ternario dentro de una comprensión — `[x if x > 0 else 0 for x in vals]` — mapea valores a través de una condición de dos vías (patrón ReLU).
- Mantén las comprensiones cortas (1–2 líneas). Para lógica compleja de varios pasos, un bucle `for` normal es más legible.
Normalización de características: `[(x - media) / std for x in features]`. Funciones de activación: `[max(0, x) for x in salida_capa]`. Filtrado de etiquetas: `[s for s, l in zip(scores, labels) if l == 1]`. Estos patrones aparecen constantemente en scripts de preparación de datos antes de introducir NumPy o Pandas.
Si lo quitas: Sin comprensiones, cada transformación de características o paso de filtrado de etiquetas requiere un bucle de 4 líneas. En trabajo exploratorio puedes escribir docenas de esos bucles — las comprensiones comprimen significativamente esa carga cognitiva.