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.
# 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
[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
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:
[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:
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/elseanidadas → 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:
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ú
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`.
Mostrar pista
if n % 2 == 0 al final.
Solución disponible después de 3 intentos
Ejercicio de repaso
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)`.
Mostrar pista
Dos comprensiones separadas.
Solución disponible después de 3 intentos
Desafío adicional
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.
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