Explicación de las comprensiones de listas de Python: cuándo usarlas y cuándo no (2026)
Las listas por comprensión son una de las características más incomprendidas de Python. Los principiantes los evitan porque "parecen complicados". Los intermedios los usan en exceso hasta que cada tercera línea es una línea anidada que nadie puede leer. Este tutorial corrige ambos errores.
Cubriremos: la forma exacta de tres partes que sigue cada lista de comprensión, puntos de referencia frente a para / mapa / filtro, los cuatro patrones que debe reconocer a simple vista y una regla estricta sobre cuándo dejar de usar comprensiones y buscar un bucle simple en su lugar.
La forma: [ qué | fuente | filtro]
Cada lista de comprensión consta de tres partes, en este orden:
Leyendo en voz alta: "dame `expresión` para cada `elemento` en `iterable`, pero sólo cuando la `condición` sea verdadera."
Comience con el bucle for equivalente y luego contraigalo:
Mismo resultado: [0, 4, 16, 36, 64]. La comprensión es de una línea, asigna la lista por adelantado (sin llamadas append) y el compilador de código de bytes de Python emite LIST_APPEND, una ruta rápida que omite la búsqueda de atributos en .append.
Punto de referencia: comprensión frente a bucle for frente a mapa+filtro
Construyendo una lista de números pares al cuadrado del 0 al 100.000:
| Método | Tiempo (μs) | Relativo |
|---|---|---|
| para + .append | 4.800 | 1,9× línea de base |
| lista(mapa(..., filtro(...))) | 3.200 | 1,3× valor inicial |
| Comprensión de listas | 2.500 | 1,0× (más rápido) |
Medido en Python 3.13, ejecución única de 1000 iteraciones. Las comprensiones ganan porque no hay una llamada a función por elemento: la expresión está entre líneas.
Dicho esto: no microoptimizar. Para una lista de 100 elementos, los tres se completan en menos de 100 µs. Elija primero la legibilidad.
Los cuatro patrones que debes reconocer
1. Transforma cada elemento
Reemplazo directo para map(str.title, nombres) pero no necesita ajuste list(...).
2. Filtrar sin transformar
Más limpio que lista (filtro (lambda n: n> 0, números)). No se necesita "lambda".
3. Filtrar Y transformar
Aquí es donde las comprensiones superan claramente a las alternativas: intente escribirlo con "mapa" + "filtro" y cuente los paréntesis.
4. Aplanar una lista anidada
El orden importa: for fila en matriz se lee de izquierda a derecha como los bucles for anidados equivalentes. Este es el único patrón en el que las comprensiones anidadas siguen siendo legibles; cualquier cosa más profunda necesita un bucle.
Cuándo DEJAR de usar comprensiones
Tres reglas estrictas, en orden de importancia:
1. Tres o más cláusulas `for` → usan un bucle. Una comprensión triplemente anidada es ilegible incluso para la persona que la escribió hace 20 minutos.
2. Efectos secundarios → use un bucle. Las comprensiones sirven para construir una lista. Si llama a una función por sus efectos secundarios (escribir en un archivo, enviar una solicitud), utilice un bucle. [print(x) for x in items] es un olor a código: estás creando una lista desechable de Ninguno.
3. La expresión tiene más de 60 caracteres → divídala. Si necesita pensar durante más de 3 segundos para analizarla, divídala en una función con nombre o en un bucle.
Dicta y establece comprensiones: la misma forma
Misma sintaxis, diferentes corchetes:
Las comprensiones de dictados son especialmente útiles para invertir una asignación ({v: k for k, v in d.items()}) o crear una tabla de búsqueda a partir de una lista.
Expresiones generadoras: el primo amigable con la memoria
Suelta los corchetes, mantén los paréntesis:
Para sum, min, max, any, all, ", ".join(...) y otras funciones que se iteran una vez, prefiera la expresión generadora: guarda la asignación de la lista intermedia. Para cualquier cosa que necesite indexar o iterar dos veces, utilice una comprensión.
Práctica: tres ejercicios
Reescribe cada uno usando una lista de comprensión. Las soluciones están al final.
1. Dadas palabras = ["gato", "elefante", "perro", "hipopótamo"], obtenga una lista de palabras de más de 4 caracteres, todas en mayúsculas.
2. Dado data = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}], extraiga una lista solo de los nombres.
3. Dados pares = [(1, 2), (3, 4), (5, 6)], obtenga una lista de las sumas de cada par.
Soluciones:
La comprensión de listas es una característica distintiva de Python: saber cuándo alcanzar una (y cuándo dejarla como un bucle "for") es un marcador confiable de fluidez de nivel intermedio. Practique reescribiendo los bucles for + .append existentes que encuentre en su propio código; No todos deberían comprenderlo, pero los que deberían resultar obvios después de una semana.
Siguiente paso: pruebe 5 lecciones interactivas sobre listas por comprensión con Python real ejecutándose en su navegador y un mentor de IA en cada paso.