Skip to content

📙 Clase 07 — List comprehensions

Fase 1 · Estructuras de datos y bucles ⬅️ Volver al índice de clases

🎯 Qué aprendí

  • Crear listas en una sola línea con [expresión for elemento in coleccion].
  • Filtrar con if y transformar con if/else.
  • La misma idea para diccionarios y sets, y cuándo NO abusar de esto.

📖 PARTE TEÓRICA

✨ 1. La idea: crear una lista describiéndola

Un list comprehension es una forma corta y pythónica de construir una lista a partir de otra colección. Reemplaza el patrón "crea lista vacía + for + append".

python
# Forma larga (lo que ya sabes):
dobles = []
for x in range(1, 6):
    dobles.append(x * 2)

# Forma corta (comprehension) — EXACTAMENTE lo mismo:
dobles = [x * 2 for x in range(1, 6)]
print(dobles)   # [2, 4, 6, 8, 10]

Anatomía:

[  x * 2   for   x   in   range(1, 6)  ]
    │        │    │    │        │
    │        │    │    │        └── la colección de origen
    │        │    │    └─────────── palabra clave
    │        │    └──────────────── variable (cada elemento)
    │        └───────────────────── inicia el "for"
    └────────────────────────────── QUÉ guardar de cada elemento (la expresión)

💡 Léelo de derecha a izquierda: "para cada x en el rango, guarda x*2".

🔎 2. Filtrar con if (al final)

Agrega un if al final para quedarte solo con los que cumplen una condición.

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

palabras = ["hola", "mundo", "python"]
largas = [p for p in palabras if len(p) > 4]
print(largas)   # ['mundo', 'python']

Léelo: "para cada x en el rango, si es par, guárdalo".

🔀 3. Transformar con if/else (al inicio)

Si quieres decidir qué guardar (no si guardar), el if/else va antes del for, en la expresión.

python
etiquetas = ["par" if x % 2 == 0 else "impar" for x in range(4)]
print(etiquetas)   # ['par', 'impar', 'par', 'impar']

⚠️ Cuidado con la posición del if:

  • if al finalfiltra (decide si el elemento entra): [x for x in xs if cond]
  • if/else al iniciotransforma (decide qué valor entra): [a if cond else b for x in xs]

🔤 4. Ejemplos que usarás

python
# Transformar textos
print([c.upper() for c in "abc"])          # ['A', 'B', 'C']

# Longitudes de cada palabra
palabras = ["hola", "mundo", "python"]
print([len(p) for p in palabras])          # [4, 5, 6]

# Aplanar una lista de listas (dos for)
matriz = [[1, 2], [3, 4]]
print([n for fila in matriz for n in fila])  # [1, 2, 3, 4]

🧩 5. También hay comprehensions de dict y de set

La misma idea sirve para construir diccionarios ({k: v}) y sets ({v}).

python
palabras = ["hola", "mundo", "python"]

# Dict comprehension: palabra → su longitud
print({p: len(p) for p in palabras})       # {'hola': 4, 'mundo': 5, 'python': 6}

# Set comprehension: longitudes únicas
print({len(p) for p in palabras})          # {4, 5, 6}

🛑 6. Cuándo NO usarlo

Las comprehensions son geniales para transformar/filtrar simple. Si la lógica es larga (varios if, efectos secundarios, muchas líneas), usa un for normal: se lee mejor.

🧪 Tip de entrevista: "¿Qué es un list comprehension y cuándo evitarlo?" → Una forma concisa de crear listas ([expr for x in xs if cond]). Se evita cuando la lógica es compleja: ahí un for explícito es más legible. Legibilidad > brevedad.


🖥️ EN TU APP DE ESCRITORIO

Las comprehensions son tu herramienta para preparar los datos que vas a mostrar: filtrar lo que se ve, transformar textos, extraer un campo de una lista de diccionarios.

python
tareas = [
    {"texto": "Comprar pan", "hecha": False},
    {"texto": "Estudiar",    "hecha": True},
    {"texto": "Llamar a Ana","hecha": False},
]

# Solo las tareas pendientes (filtrar) para pintarlas:
pendientes = [t for t in tareas if not t["hecha"]]

# Solo los textos (extraer un campo) para un CTkOptionMenu:
textos = [t["texto"] for t in tareas]
menu.configure(values=textos)

# Normalizar lo que escribió el usuario en varios campos:
valores = [campo.get().strip() for campo in [entry_nombre, entry_email]]
En tu appLa comprehension hace
Mostrar solo pendientes / completadasfiltrar la lista con if
Rellenar un desplegableextraer un campo: [t["texto"] for t in tareas]
Buscar en vivo[t for t in tareas if texto in t["texto"].lower()]
Limpiar varios CTkEntry[e.get().strip() for e in entries]

💡 Búsqueda en vivo en una lista: cada vez que el usuario teclea, un comprehension filtra la lista por lo que escribió y vuelves a pintar. Es el corazón de un buscador en tu GUI.


🗄️ CON BASE DE DATOS (caso de uso)

Tras un SELECT, una comprehension transforma las filas en lo que la GUI necesita:

python
filas = con.execute("SELECT nombre, tel FROM contactos").fetchall()

# Solo los nombres, para un desplegable:
nombres = [fila[0] for fila in filas]

# Filas (tuplas) → diccionarios, para trabajar más cómodo:
contactos = [{"nombre": n, "tel": t} for n, t in filas]

🗄️ Este patrón "SELECT → comprehension → lista de dicts para la GUI" lo repetirás en cada pantalla que muestre datos guardados.


🏋️ EJERCICIOS CON SOLUCIÓN

Ejercicio 1 — Cuadrados

Crea una lista con los cuadrados de 1 a 5 ([1, 4, 9, 16, 25]) en una sola línea.

Ver solución
python
cuadrados = [x**2 for x in range(1, 6)]
print(cuadrados)   # [1, 4, 9, 16, 25]

Ejercicio 2 — Solo positivos

De nums = [-3, 5, -1, 8, 0], deja solo los mayores que 0.

Ver solución
python
nums = [-3, 5, -1, 8, 0]
positivos = [n for n in nums if n > 0]
print(positivos)   # [5, 8]

Ejercicio 3 — Aprobado/Reprobado

De notas = [15, 8, 20, 10, 5], crea una lista con "aprobado" si la nota es ≥ 11, si no "reprobado".

Ver solución
python
notas = [15, 8, 20, 10, 5]
estado = ["aprobado" if n >= 11 else "reprobado" for n in notas]
print(estado)   # ['aprobado', 'reprobado', 'aprobado', 'reprobado', 'reprobado']

Ejercicio 4 — Extraer un campo (estilo app)

De contactos = [{"nombre": "Ana", "tel": "1"}, {"nombre": "Luis", "tel": "2"}], obtén una lista solo con los nombres.

Ver solución
python
contactos = [{"nombre": "Ana", "tel": "1"}, {"nombre": "Luis", "tel": "2"}]
nombres = [c["nombre"] for c in contactos]
print(nombres)   # ['Ana', 'Luis']

❓ Preguntas y respuestas (autoevaluación)

1. Escribe el equivalente en comprehension de: crear una lista con x*3 para x de 0 a 3.

[x*3 for x in range(4)][0, 3, 6, 9].

2. ¿Dónde va el if para filtrar y dónde el if/else para transformar?

El if de filtrar va al final; el if/else de transformar va al inicio (en la expresión).

3. ¿Un comprehension puede crear diccionarios?

Sí: {clave: valor for x in xs} (dict comprehension). También hay de sets: {v for x in xs}.

4. ¿Cuándo es mejor un for normal que un comprehension?

Cuando la lógica es compleja o larga: la legibilidad manda sobre la brevedad.


📎 Apuntes relacionados

➡️ Siguiente

¡Terminaste la Fase 1! 🎉 Sigue la Fase 2 · Funciones a fondo (return, módulos, try/except). Avísame y la generamos igual de detallada.