Skip to content

📙 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!).
  • map y filter (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))                 # 10
lambda   x   :   x * 2
   │     │       │
   │     │       └── lo que DEVUELVE (return implícito)
   │     └────────── parámetro(s)
   └──────────────── "función anónima"

📌 Un lambda no es "mejor" que def — es para funciones desechables que se pasan como argumento (a sorted, a command=…). Si tiene nombre y se reusa, usa def.

🔧 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 ALGUNOS

Pero 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/filter o comprehensions?" → Hacen lo mismo; en Python moderno se prefieren las comprehensions por legibilidad. map/filter ganan 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, descendente

min/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 appEl combo
Ordenar la tabla al hacer clic en una columnasorted(filas, key=lambda f: f[col])
"El más caro / más urgente"max(items, key=...)
Normalizar entradaslist(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 necesita

Ejercicio 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?

lambda para funciones desechables de una línea pasadas como argumento; def para 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

➡️ Siguiente

Clase 25 · Generadores — producir datos bajo demanda con yield.