Saltar al contenido principal
eLearner.app
Módulo 6 · Lección 1 de 421/36 en el curso~12 min
Lecciones del módulo (1/4)

List comprehension

Una comprensión de lista (list comprehension) es una expresión que construye una lista aplicando una transformación (y opcionalmente un filtro) a un iterable. Es la forma pythónica de escribir for + append en una sola línea.

Python
# estilo imperativo (verboso)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# estilo pythónico
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

Sintaxis completa

Python
[espressione for elemento in iterabile if condizione]
  • expression: qué poner en la lista resultante
  • for element in iterable: bucle de origen
  • if condition (opcional): mantiene solo los elementos que coinciden
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

if/else dentro de la expresión (ternario)

Para transformar condicionalmente (en lugar de filtrar), usa la expresión ternaria ANTES del for:

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

Multi-for: producto cartesiano

Puedes anidar múltiples cláusulas for:

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

El orden de las cláusulas for es "externo-antes-interno", como si fueran bucles anidados.

Cuándo NO usar una comprensión

  • Lógica compleja con muchas ramas if/else anidadas → usa un bucle explícito.
  • Efectos secundarios (print, escritura de archivos) → usa un bucle normal, no una comprensión.
  • Más de 2 niveles anidados → un bucle explícito con nombre casi siempre es mejor.

Comprensiones de listas anidadas

Puedes encadenar múltiples bucles for dentro de una sola comprensión de lista. Por ejemplo, para aplanar una matriz (una lista de listas) en una sola lista plana, puedes escribir:

Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]

El orden de los bucles refleja exactamente el orden de anidamiento de los bucles for tradicionales.

Pruébalo tú

Ejercicio#python.m6.l1.e1
Intentos: 0Cargando...

Dada la lista `nums = [1, 2, 3, 4, 5, 6]`, construye `even_squares` con los cuadrados de solo los números pares. Evalúa `even_squares`.

Cargando editor...
Mostrar pista

if n % 2 == 0 al final.

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#python.m6.l1.e2
Intentos: 0Cargando...

Dada la lista `words = ['Ciao', 'Mondo', 'Python', 'Java']`, construye `lengths` con la longitud de CADA palabra, y `short_words` con solo las palabras más cortas de 5 caracteres. Evalúa `(lengths, short_words)`.

Cargando editor...
Mostrar pista

Dos comprensiones separadas.

Solución disponible después de 3 intentos

Desafío adicional

Ejercicio#python.m6.l1.e3
Intentos: 0Cargando...

Usa una comprensión de lista para calcular los cuadrados de solo los enteros pares entre 1 y 10 inclusive. Guarda la lista en `even_squares` y evalúala.

Cargando editor...
Mostrar pista

Usa range(1, 11) para iterar, if x % 2 == 0 para filtrar y x**2 como expresión.

Solución disponible después de 3 intentos