Apariencia
📙 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
ify transformar conif/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
xen el rango, guardax*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:
ifal final → filtra (decide si el elemento entra):[x for x in xs if cond]if/elseal inicio → transforma (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í unforexplí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 app | La comprehension hace |
|---|---|
| Mostrar solo pendientes / completadas | filtrar la lista con if |
| Rellenar un desplegable | extraer 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
ifde filtrar va al final; elif/elsede 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
- La forma larga (for + append) → Clase 02 · for
- Las listas que creas → Clase 01 · Listas
- Filtrar dicts → Clase 04 · Diccionarios
➡️ 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.