Kodokon kodokon.com

Comprensiones de listas y de diccionarios

Sustituye tus bucles de construcción por comprensiones expresivas, para transformar, filtrar y reindexar tus datos.

8 min · 3 preguntas

Abrir esta lección en Kodokon

Una comprensión de lista condensa el patrón más habitual de la programación: construir una lista transformando o filtrando una secuencia. La sintaxis se lee como una frase: [expression for element in sequence if condition]. Mismo resultado que un bucle con append, en una sola línea declarativa que cualquier desarrollador de Python reconoce al instante.

PYTHON
prices = [12.0, 49.9, 5.5, 199.0]

with_tax = [round(p * 1.2, 2) for p in prices]
cheap = [p for p in prices if p < 50]

print(with_tax)  # [14.4, 59.88, 6.6, 238.8]
print(cheap)     # [12.0, 49.9, 5.5]
Transforma con la expresión, filtra con el if final.

La comprensión de diccionario sigue la misma lógica con la sintaxis {key: value for ...}. Un caso de uso muy habitual en los proyectos: reindexar una lista de objetos por su identificador, para obtener después búsquedas instantáneas en lugar de recorrer la lista cada vez que necesitas algo.

PYTHON
users = [
    {"id": 7, "name": "Alice"},
    {"id": 12, "name": "Bruno"},
    {"id": 31, "name": "Chloe"},
]

by_id = {u["id"]: u["name"] for u in users}
print(by_id[12])    # Bruno
print(31 in by_id)  # True
Reindexar por identificador: un clásico del código profesional.

Dos posiciones para if, dos papeles diferentes. Colocado después del for, filtra: los elementos rechazados no aparecen en el resultado. Colocado antes del for, como expresión condicional (a if condition else b), elige un valor para cada elemento: la lista conserva entonces la misma longitud que la fuente.

PYTHON
scores = [45, 82, 67, 91]

labels = ["pass" if s >= 60 else "fail" for s in scores]
print(labels)  # ['fail', 'pass', 'pass', 'pass']
La expresión condicional transforma cada elemento sin eliminar ninguno.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. En [x * 2 for x in data if x > 0], ¿cuál es el papel del if?
    • Elige entre dos valores para cada elemento
    • Filtra: solo se conservan los elementos positivos
    • Detiene la comprensión en el primer elemento negativo
  2. ¿Qué produce {n: n * n for n in range(3)}?
    • {0: 0, 1: 1, 2: 4}
    • {1: 1, 2: 4, 3: 9}
    • [0, 1, 4]
    • {0, 1, 4}
  3. ¿Cuándo conviene sustituir una comprensión por un bucle clásico?
    • Cuando la lógica se vuelve compleja o anidada
    • En cuanto la lista supera el centenar de elementos
    • Nunca, la comprensión siempre es preferible