En Python, la función incorporada sorted() ordena listas comparando sus elementos con el operador <. Esto funciona bien con números y cadenas, pero puede fallar en estructuras más complejas, como listas de diccionarios.
⏬ Imagina que recibimos una lista de usuarios y necesitamos ordenarlos por edad:
users = [
{ 'name': 'Juan', 'age': 19 },
{ 'name': 'Sofía', 'age': 1 },
{ 'name': 'Carlos', 'age': 4 },
{ 'name': 'Mateo', 'age': 16 },
]
La función sorted() no puede ordenar esta lista correctamente sin ayuda, porque los elementos son diccionarios y no valores simples.
Queremos poder ordenar por cualquier criterio y en cualquier orden, sin tener que reescribir una función sorted() para cada caso.
Parámetro key en sorted()
Python ofrece una solución elegante: la función sorted() permite definir un criterio de ordenamiento a través del parámetro key:
sorted(iterable, /, *, key=None, reverse=False)
Este parámetro acepta una función personalizada que indica cómo comparar los elementos. Así, no tenemos que modificar el algoritmo de ordenamiento, solo decidir qué comparar.
⏬ Ejemplo: ordenar por edad
def sort_key(user):
return user['age']
sorted_users = sorted(users, key=sort_key)
print(sorted_users)
# => [ { 'name': 'Sofía', 'age': 1 },
# { 'name': 'Carlos', 'age': 4 },
# { 'name': 'Mateo', 'age': 16 },
# { 'name': 'Juan', 'age': 19 } ]
sorted() hace todo el trabajo de mover los elementos en la lista. La función sort_key extrae el valor age de cada usuario para comparar.
Funciones de orden superior y callbacks
Las funciones que aceptan o devuelven otras funciones se llaman funciones de orden superior. sorted() es un ejemplo, ya que recibe una función (key) como argumento.
La función que pasamos a sorted() se llama callback (función de retorno), porque no la llamamos directamente, sino que sorted() la ejecuta por nosotros.
⏬ Ejemplo de callback:
def say(fn):
message = fn() # Llama a la función que recibe como argumento
print(message)
my_callback_fn = lambda: '¡Hola!'
say(my_callback_fn) # => ¡Hola!
Uso de lambdas en sorted()
En lugar de definir una función con def, podemos usar una función lambda directamente en sorted() para ordenar una lista de diccionarios:
sorted(users, key=lambda user: user['age'])
# => [ { 'name': 'Sofía', 'age': 1 },
# { 'name': 'Carlos', 'age': 4 },
# { 'name': 'Mateo', 'age': 16 },
# { 'name': 'Juan', 'age': 19 } ]
Lambda user: user['age'] reemplaza a sort_key() en una sola línea. Esta forma es más concisa y clara cuando la función es pequeña.
Eliminando ciclos con funciones de orden superior
Las funciones de orden superior pueden reemplazar ciclos, haciendo el código más expresivo.
⏬ Ejemplo avanzado de map() y filter():
'\n'.join(
map(
lambda user: f"{user['name']} tiene {user['age']} años",
filter(lambda user: user['age'] >= 16, users)
)
)
# => Juan tiene 19 años
# Mateo tiene 16 años
filter()selecciona usuarios con age>= 16.map()transforma cada usuario en una cadena de texto.join()une las líneas en un solo string.
En los próximos temas exploraremos tres funciones clave de orden superior:
map()para transformar datos.filter()para filtrar elementos.reduce()para reducir listas a un solo valor.
Estas funciones son muy poderosas y permiten resolver problemas sin escribir ciclos manualmente
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.