- Sumar dinero con reduce()
- Agrupar personas por edad con reduce()
- Contar lecciones en cursos con reduce()
- Implementando reduce() desde cero
- Resumen
reduce() es una función que nos ayuda a combinar elementos de una lista en un solo resultado. Se usa cuando necesitamos:
- Sumar valores.
- Agrupar datos.
- Reducir una colección a un solo valor o estructura.
A diferencia de map() y filter(), reduce() trabaja con un acumulador, que es un valor que crece en cada iteración.
Sumar dinero con reduce()
💰 Imagina que tenemos una lista de personas con diferentes cantidades de dinero y queremos calcular el total:
users = [
{ 'name': 'Carlos', 'amount': 19 },
{ 'name': 'Luis', 'amount': 1 },
{ 'name': 'Mariana', 'amount': 4 },
{ 'name': 'Sofía', 'amount': 16 },
]
total = 0
for user in users:
total += user['amount']
print(total) # => 40
🤔 ¿Por qué usar reduce()?
Podemos hacer lo mismo con reduce(), que nos permite escribir menos código:
from functools import reduce
users = [
{ 'name': 'Carlos', 'amount': 19 },
{ 'name': 'Luis', 'amount': 1 },
{ 'name': 'Mariana', 'amount': 4 },
{ 'name': 'Sofía', 'amount': 16 },
]
total = reduce(lambda acc, user: acc + user['amount'], users, 0)
print(total) # => 40
🔹 acc: almacena la suma acumulada.
🔹 user['amount']: representa el dinero de cada usuario.
🔹 0: es el valor inicial del acumulador.
Agrupar personas por edad con reduce()
👥 Ahora queremos agrupar los nombres según su edad.
users = [
{ 'name': 'Ana', 'age': 4 },
{ 'name': 'Carlos', 'age': 19 },
{ 'name': 'Mariana', 'age': 4 },
{ 'name': 'Sofía', 'age': 16 },
]
users_by_age = {}
for user in users:
age = user['age']
name = user['name']
if age not in users_by_age:
users_by_age[age] = []
users_by_age[age].append(name)
print(users_by_age)
# => { 4: ['Ana', 'Mariana'], 16: ['Sofía'], 19: ['Carlos'] }
Con reduce(), podemos hacer lo mismo en menos líneas:
from functools import reduce
users = [
{ 'name': 'Ana', 'age': 4 },
{ 'name': 'Carlos', 'age': 19 },
{ 'name': 'Mariana', 'age': 4 },
{ 'name': 'Sofía', 'age': 16 },
]
def group_by_age(acc, user):
if user['age'] not in acc:
acc[user['age']] = []
acc[user['age']].append(user['name'])
return acc # Siempre hay que devolver el acumulador
users_by_age = reduce(group_by_age, users, {})
print(users_by_age)
📌 reduce() toma cada usuario, revisa su edad y lo agrega a la lista correspondiente.
Contar lecciones en cursos con reduce()
Imagina que tenemos varios cursos y queremos contar el total de lecciones:
courses = [
{
'name': 'Arreglos',
'lessons': [{ 'name': 'Uno' }, { 'name': 'Dos' }]
},
{
'name': 'Objetos',
'lessons': [{ 'name': 'Intro' }, { 'name': 'Uno' }, { 'name': 'Dos' }]
}
]
Podemos resolverlo con un bucle for:
total = 0
for course in courses:
total += len(course['lessons'])
print(total) # => 5
O con reduce():
from functools import reduce
total_lessons = reduce(lambda acc, course: acc + len(course['lessons']), courses, 0)
print(total_lessons) # => 5
Implementando reduce() desde cero
Podemos escribir nuestra propia versión de reduce():
def my_reduce(callback, collection, init):
acc = init # Iniciar el acumulador
for item in collection:
acc = callback(acc, item) # Actualizar el acumulador
return acc
users = [
{ 'name': 'Ana', 'age': 4 },
{ 'name': 'Carlos', 'age': 19 },
{ 'name': 'Mariana', 'age': 4 },
{ 'name': 'Sofía', 'age': 16 },
]
oldest = my_reduce(
lambda acc, user: user if user['age'] > acc['age'] else acc,
users,
users[0],
)
print(oldest) # => { 'name': 'Carlos', 'age': 19 }
Resumen
- Usa
reduce()cuando necesites transformar una lista en un solo resultado. - No lo uses si
map()ofilter()pueden resolverlo de forma más sencilla. - Siempre devuelve el acumulador en la función que pasas a reduce().
Ahora puedes usar reduce() para hacer cálculos y agrupaciones de manera más eficiente.
Materiales adicionales
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.