itertools.accumulate: sumas y estados acumulados

Publicado el: 30/08/2026
Tempo de leitura: 2 minutos
Close-up of hands typing on a laptop keyboard, Python book in sight, coding in progress.

itertools.accumulate() produce resultados acumulados mientras recorre un iterable. Por defecto calcula sumas progresivas, pero también acepta multiplicación, máximo, mínimo o una transición de estado personalizada. Como devuelve un iterador, funciona bien en pipelines y streams grandes.

Esta guía cubre totales acumulados, initial, funciones de operator, saldos, récords progresivos, medias y riesgos con estado mutable.

Suma acumulada

from itertools import accumulate

valores = [10, 5, -2, 8]
print(list(accumulate(valores)))
# [10, 15, 13, 21]

Cada salida combina el acumulado anterior con el siguiente elemento.

Valor inicial

print(list(accumulate([5, 7, 3], initial=100)))
# [100, 105, 112, 115]

El valor inicial se emite primero, algo útil para saldos, posiciones y estados anteriores al primer evento.

Producto acumulado

from operator import mul

print(list(accumulate([2, 3, 4], mul)))
# [2, 6, 24]

Máximo progresivo

temperaturas = [18, 20, 19, 24, 22]
print(list(accumulate(temperaturas, max)))
# [18, 20, 20, 24, 24]

Saldos después de movimientos

movimientos = [200, -50, -25, 100]
saldos = accumulate(movimientos, initial=1000)
for saldo in saldos:
    print(saldo)

Transición personalizada

def limitar(actual, cambio):
    return max(0, actual + cambio)

estados = accumulate([-3, 8, -20, 5], limitar, initial=10)

La función recibe el estado acumulado y el siguiente elemento, y devuelve el nuevo estado.

Procesamiento lazy

accumulate calcula valores solo cuando se solicitan. Puede combinarse con islice, filtros y otras herramientas de itertools.

from itertools import accumulate, islice

primeros = islice(accumulate(eventos(), actualizar_estado), 100)

Media acumulada

def actualizar(estado, valor):
    total, cantidad = estado
    return total + valor, cantidad + 1

estados = accumulate([10, 20, 15], actualizar, initial=(0, 0))
medias = [total / cantidad for total, cantidad in estados if cantidad]

Preferir estados inmutables

Si la función modifica y devuelve la misma lista o diccionario, todos los resultados pueden referirse al mismo objeto. Usa tuplas, dataclasses frozen o copias explícitas.

accumulate frente a sum

sum devuelve únicamente el total final. accumulate expone cada estado intermedio.

accumulate frente a reduce

functools.reduce combina elementos, pero produce un único resultado. Elige accumulate cuando la evolución completa sea importante.

Precisión numérica

Las sumas largas de floats pueden acumular errores de redondeo. Para valores decimales usa decimal.Decimal. math.fsum puede mejorar un total final de floats, aunque no genera estados intermedios.

Errores comunes

  • Olvidar que initial añade una salida.
  • Invertir los argumentos de la función acumuladora.
  • Modificar el mismo objeto de estado.
  • Convertir un resultado infinito en lista.
  • Esperar un escalar en vez de un iterador.

Buenas prácticas

Mantén la transición pura, usa estados pequeños e inmutables, documenta el valor inicial y consume el iterador progresivamente. Consulta las guías internas de itertools, groupby y pairwise.

Conclusión

itertools.accumulate es una herramienta compacta para totales progresivos y transiciones de estado. Su diseño lazy permite pipelines de bajo consumo de memoria.

Fuentes externas

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    A person reads 'Python for Unix and Linux System Administration' indoors.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    itertools.groupby: agrupa datos ordenados correctamente

    Aprende itertools.groupby en Python para datos ordenados, agregaciones streaming, subiteradores compartidos y agrupación correcta.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    A person in a hoodie coding on dual monitors, depicting cybersecurity and hacking themes.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    contextlib.chdir: riesgos al cambiar directorios

    Aprende contextlib.chdir en Python, sus riesgos con estado global y concurrencia y cuándo usar pathlib o subprocess cwd.

    Ler mais

    Tempo de leitura: 3 minutos
    30/08/2026
    A person typing on a laptop with a Python programming book visible, capturing technology and learning.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    nullcontext en Python: contextos opcionales

    Usa nullcontext en Python para unificar archivos, locks, transacciones, sesiones y recursos prestados sin duplicar ramas.

    Ler mais

    Tempo de leitura: 4 minutos
    30/08/2026
    Vivid close-up of a python resting among autumn leaves, showcasing its intricate patterns.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    contextlib.aclosing: cierra generadores async

    Aprende contextlib.aclosing en Python para cerrar generadores async tras break, return, excepciones, cancelación y consumo parcial.

    Ler mais

    Tempo de leitura: 5 minutos
    30/08/2026
    High-angle view of woman coding on a laptop, with a Python book nearby. Ideal for programming and tech content.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    weakref.finalize: limpieza sin retener objetos

    Aprende weakref.finalize en Python para limpiar recursos sin retener objetos, usando alive, detach, shutdown y cierre explícito seguro.

    Ler mais

    Tempo de leitura: 5 minutos
    30/08/2026
    A developer typing code on a laptop with a Python book beside in an office.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    SimpleNamespace: objetos ligeros con atributos

    Aprende SimpleNamespace en Python para crear objetos ligeros por atributos, convertir diccionarios, copiar y elegir modelos tipados.

    Ler mais

    Tempo de leitura: 5 minutos
    29/08/2026