Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Agregación (reduce) Python: Funciones

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() o filter() 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

  1. Función reduce

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.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY