Apariencia
📙 Clase 24 — lambda, map, filter y sorted(key=)
Fase 5 · Python intermedio / "pro" ⬅️ Volver al índice de clases
🎯 Qué aprendí
lambda: funciones anónimas de una línea (¡ya usaba una en mi To-Do!).mapyfilter(y cuándo preferir la comprehension equivalente).- La estrella real:
sorted(key=...)— ordenar cualquier cosa por cualquier criterio.
📖 PARTE TEÓRICA
⚡ 1. lambda: función sin nombre, de una línea
python
doble = lambda x: x * 2 # equivale a: def doble(x): return x * 2
print(doble(5)) # 10lambda x : x * 2
│ │ │
│ │ └── lo que DEVUELVE (return implícito)
│ └────────── parámetro(s)
└──────────────── "función anónima"📌 Un
lambdano es "mejor" quedef— es para funciones desechables que se pasan como argumento (asorted, acommand=…). Si tiene nombre y se reusa, usadef.
🔧 2. map y filter
python
nums = [1, 2, 3, 4]
print(list(map(lambda x: x * 2, nums))) # [2, 4, 6, 8] transformar TODOS
print(list(filter(lambda x: x % 2 == 0, nums))) # [2, 4] quedarse con ALGUNOSPero ojo — ya conoces una forma más pythónica (Clase 07):
python
print([x * 2 for x in nums]) # = map (más legible)
print([x for x in nums if x % 2 == 0]) # = filter (más legible)🧪 Tip de entrevista: "¿
map/filtero comprehensions?" → Hacen lo mismo; en Python moderno se prefieren las comprehensions por legibilidad.map/filterganan cuando ya tienes la función hecha:map(str.strip, lineas).
🏆 3. sorted(key=...): la que sí usarás a diario
key= recibe una función que dice con qué valor comparar cada elemento. Ahí brilla lambda:
python
tareas = [
{"texto": "C", "prioridad": 3},
{"texto": "A", "prioridad": 1},
{"texto": "B", "prioridad": 2},
]
orden = sorted(tareas, key=lambda t: t["prioridad"])
print([t["texto"] for t in orden]) # ['A', 'B', 'C'] ← por prioridad
print(sorted(["python", "es", "genial"], key=len, reverse=True))
# ['python', 'genial', 'es'] ← por longitud, descendentemin/max aceptan el mismo key:
python
urgente = max(tareas, key=lambda t: t["prioridad"])
print(urgente["texto"]) # C🖥️ EN TU APP DE ESCRITORIO
Ya usas lambda — en command=lambda t=tarea: borrar(t) (Clase 10). La otra mitad de su vida útil en GUIs es ordenar lo que se muestra:
python
class App(ctk.CTk):
def _pintar(self, criterio="prioridad"):
claves = {
"prioridad": lambda t: t["prioridad"],
"alfabético": lambda t: t["texto"].lower(),
"recientes": lambda t: t["creada"],
}
for tarea in sorted(self._tareas, key=claves[criterio],
reverse=(criterio == "recientes")):
... # crear el widget de cada tarea
# conectado a un desplegable:
ctk.CTkOptionMenu(self, values=["prioridad", "alfabético", "recientes"],
command=lambda c: self._pintar(c))| En tu app | El combo |
|---|---|
| Ordenar la tabla al hacer clic en una columna | sorted(filas, key=lambda f: f[col]) |
| "El más caro / más urgente" | max(items, key=...) |
| Normalizar entradas | list(map(str.strip, textos)) |
🗄️ CON BASE DE DATOS (caso de uso)
En BD, el equivalente de sorted(key=) es ORDER BY — deja que la BD ordene cuando los datos viven allá; usa sorted cuando ya los tienes en memoria:
python
# BD ordena (mejor si hay miles de filas):
filas = con.execute("SELECT * FROM tareas ORDER BY prioridad DESC").fetchall()
# Python ordena (los datos ya están cargados, orden distinto sin re-consultar):
filas_alfabetico = sorted(filas, key=lambda f: f[1].lower())🏋️ EJERCICIOS CON SOLUCIÓN
Ejercicio 1 — Por precio
Ordena productos = [("mouse", 45), ("teclado", 120), ("cable", 15)] por precio, de mayor a menor.
Ver solución
python
productos = [("mouse", 45), ("teclado", 120), ("cable", 15)]
print(sorted(productos, key=lambda p: p[1], reverse=True))
# [('teclado', 120), ('mouse', 45), ('cable', 15)]Ejercicio 2 — Limpieza masiva
Con map, quita espacios de [" ana ", " luis "] (pista: str.strip ya existe).
Ver solución
python
print(list(map(str.strip, [" ana ", " luis "]))) # ['ana', 'luis']
# sin lambda: str.strip YA es la función que map necesitaEjercicio 3 — El contacto más nuevo
De contactos = [{"nombre": "Ana", "creado": "2026-05-01"}, {"nombre": "Luis", "creado": "2026-07-11"}], obtén el más reciente con max.
Ver solución
python
contactos = [{"nombre": "Ana", "creado": "2026-05-01"},
{"nombre": "Luis", "creado": "2026-07-11"}]
print(max(contactos, key=lambda c: c["creado"])["nombre"]) # Luis
# (las fechas ISO se comparan bien como texto — Clase 22)❓ Preguntas y respuestas (autoevaluación)
1. ¿Cuándo lambda y cuándo def?
lambdapara funciones desechables de una línea pasadas como argumento;defpara todo lo que tenga nombre, se reuse o pase de una expresión.
2. ¿Qué es más pythónico que map/filter en la mayoría de casos?
Las comprehensions:
[f(x) for x in xs]y[x for x in xs if cond].
3. ¿Qué hace el parámetro key de sorted?
Recibe una función que extrae el valor por el que comparar cada elemento.
4. ¿Cómo ordenas una lista de dicts por un campo, descendente?
sorted(lista, key=lambda d: d["campo"], reverse=True).
📎 Apuntes relacionados
- Comprehensions (los rivales legibles) → Clase 07
- El otro uso de lambda (callbacks) → Clase 10 · Scope
sortvssorted→ Clase 01
➡️ Siguiente
Clase 25 · Generadores — producir datos bajo demanda con yield.