List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

  1. Inicio
  2. Blog
  3. Desarrollo de software
Desarrollo de software

List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

Aprende la list comprehension de Python paso a paso: crea, filtra y transforma listas en una línea, mira los tiempos medidos frente a los bucles y descubre cuándo un bucle for es más claro.

7 min de lectura
List comprehension en Python: sintaxis, ejemplos y cuándo evitarla
Puntos clave
  • El patrón es [expresión for elemento in iterable if condición].
  • Un if simple al final filtra; un if-else al principio elige entre dos valores.
  • En nuestra prueba, la comprensión fue un 37 % más rápida que un bucle con append.
  • Usa una expresión generadora con datos enormes y un bucle normal cuando la lógica necesite varios pasos claros.

Una list comprehension de Python crea una lista nueva a partir de cualquier iterable en una sola línea legible. En lugar de crear una lista vacía, recorrerla y llamar a append, describes el resultado que quieres.

Esta guía va del patrón básico a los filtros, los bucles anidados y los tiempos que medimos nosotros mismos. Si Python es nuevo para ti, empieza con el tutorial de Python para principiantes y mantén un entorno limpio con la guía de entornos virtuales.

Sintaxis de la list comprehension en Python

Léela de izquierda a derecha: la expresión dice cómo es cada elemento nuevo y la parte for dice de dónde vienen los elementos.

squares = [x * x for x in range(6)]
print(squares)          # [0, 1, 4, 9, 16, 25]

names = [" Hi ", "  QA "]
clean = [n.strip().lower() for n in names]
print(clean)            # ['hi', 'qa']

El mismo resultado con un bucle necesita tres líneas más. Ese ahorro es el objetivo, siempre que la línea siga siendo fácil de leer.

Filtrar elementos con una condición

Añade un if después del bucle para conservar solo los elementos que cumplen la condición.

evens = [x for x in range(10) if x % 2 == 0]
print(evens)            # [0, 2, 4, 6, 8]

List comprehension en Python con if-else

Cuando quieres un valor para cada elemento, pon el if-else antes del for. Es la parte que más confunde a los principiantes, porque un else al final es un error de sintaxis.

labels = ["even" if x % 2 == 0 else "odd" for x in range(4)]
print(labels)           # ['even', 'odd', 'even', 'odd']

Regla práctica: un if al final elimina elementos; un if-else al principio los cambia. Con if-else la longitud de la lista no varía.

Bucles anidados y aplanado

Varias cláusulas for se leen en el mismo orden que los bucles anidados. Úsalas para aplanar una lista de listas o para formar pares.

matrix = [[1, 2, 3], [4, 5, 6]]
flat = [n for row in matrix for n in row]
print(flat)             # [1, 2, 3, 4, 5, 6]

pairs = [(x, y) for x in range(1, 3) for y in "ab"]
print(pairs)            # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]

Para trasponer la matriz, anida una comprensión dentro de otra: [[r[i] for r in matrix] for i in range(3)] devuelve [[1, 4], [2, 5], [3, 6]]. Dos niveles son el límite práctico antes de que se pierda legibilidad.

Formas de diccionario, conjunto y generador

Cambia los corchetes y la misma idea crea otros tipos.

lengths = {w: len(w) for w in ["pip", "venv", "uv"]}   # {'pip': 3, 'venv': 4, 'uv': 2}
unique  = {len(w) for w in ["pip", "venv", "uv", "git"]}  # {2, 3, 4}
total   = sum(x * x for x in range(1_000_000))           # generator, no list

Compara los propios tipos en nuestra guía de listas, tuplas, conjuntos y diccionarios (en inglés).

Velocidad y memoria: lo que medimos

Cronometramos cada versión en Python 3.13.6 con 100 000 enteros, tomando el mejor de cinco intentos. Tus números serán distintos, pero el orden es estable.

TareaTiempo
Bucle con append (duplicar cada elemento)5,18 ms
List comprehension (duplicar cada elemento)3,25 ms
list(map(lambda ...))6,50 ms
Filtrar pares con un bucle3,62 ms
Filtrar pares con una comprensión3,43 ms

La comprensión supera con claridad al bucle con append, aunque la diferencia se reduce cuando casi todo el tiempo se va en la condición. En memoria, una lista de un millón de enteros duplicados ocupó unos 8,4 MB, mientras que el generador equivalente pesó 200 bytes, porque produce los valores de uno en uno.

Cuándo no usar una list comprehension

  • Solo necesitas efectos secundarios, como imprimir o guardar. Usa un bucle normal; una comprensión crearía una lista inútil.
  • La lógica tiene varios pasos. Si necesitas una segunda variable o un try, escribe un bucle o una función pequeña.
  • Los datos son enormes. Usa una expresión generadora para que Python no guarde toda la lista en memoria.
  • Necesita más de dos cláusulas for. Divídela en pasos con nombre para quien lea después.

Para terminar

Usa una list comprehension de Python cuando una línea corta diga exactamente lo que quieres y un bucle cuando no sea así. Empieza con el patrón básico, añade un filtro y practica la forma if-else hasta que el orden te resulte natural.

Preguntas frecuentes

¿Qué es una list comprehension en Python?

Es una forma compacta de crear una lista aplicando una expresión a cada elemento de un iterable, con una condición opcional para filtrar.

¿Cómo se usa if-else en una list comprehension?

Pon la expresión condicional antes de la cláusula for, por ejemplo ["even" if x % 2 == 0 else "odd" for x in nums]. Un filtro simple usa un solo if después del bucle.

¿Es más rápida una list comprehension que un bucle for?

Normalmente sí. En nuestra prueba con 100 000 elementos fue un 37 % más rápida que un bucle con append, pero la legibilidad debe decidir primero.

¿Qué diferencia hay entre una list comprehension y una expresión generadora?

La list comprehension crea toda la lista en memoria de una vez. La expresión generadora usa paréntesis y produce un valor cada vez, lo que ahorra memoria con datos grandes.

¿Se pueden anidar las list comprehensions?

Sí, para aplanar o trasponer una matriz. Limítate a dos niveles y pasa a un bucle si cuesta leerla.

Sigue aprendiendo (artículos en inglés)

Trabaja con Stack Quora

¿Necesitas ayuda con pruebas, WordPress o SEO?

Ayudamos a los equipos a entregar mejor software y a hacer crecer sus sitios. Cuéntanos en qué trabajas y te propondremos un siguiente paso claro.

Sigue leyendo

Más guías sobre testing, IA y desarrollo moderno

¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.

Inteligencia artificial

Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas

Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…

Leer artículo →
DevOps

Explicación de las variables de entorno: archivos .env, secretos y configuración bien hechos

Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…

Leer artículo →
Desarrollo de software

Explicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429

La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …

Leer artículo →
Automatización de pruebas

Burlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan

Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…

Leer artículo →
Pruebas de software

Explicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%

Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…

Leer artículo →
Bases de datos y SQL

DELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno

DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…

Leer artículo →
Bases de datos y SQL

Vistas SQL explicadas: cree, use y evite los errores, con ejemplos

Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…

Leer artículo →
Desarrollo de software

Interfaz TypeScript versus tipo: diferencias reales, probadas con el compilador

Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…

Leer artículo →
Desarrollo de software

Python *args y **kwargs explicados: funciones flexibles con ejemplos claros

Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…

Leer artículo →
Desarrollo de software

Funciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas

Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…

Leer artículo →
Inteligencia artificial

¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar

¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…

Leer artículo →
DevOps

Monitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos

Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…

Leer artículo →
DevOps

Docker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta

Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…

Leer artículo →
Automatización de pruebas

TDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una

TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …

Leer artículo →
Desarrollo de software

Git merge vs rebase: diferencias, ejemplos y cuándo usar cada uno

Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.

Leer artículo →
Desarrollo de software

List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.

Leer artículo →