说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.accumulate() 是 Python 中 itertools 模块提供的一个函数,用于创建一个迭代器,该迭代器对输入的可迭代对象中的元素进行累积操作。默认情况下,累积操作是指将前一个元素与当前元素应用某个二元函数,并将结果作为下一个元素输出。
语法为 itertools.accumulate(iterable[, func, *, initial=None])
,与类似函数 functools.reduce() 机制差不多,但它不返回一个最终累积值,而是把累积的过程结果形成一个可迭代对象,可以理解这个序列里的内容是计算过程。参与的意义可以参考 functools.reduce() (注意:它们的参数 iterable 和 func 位置相反)。
itertools.accumulate(iterable, func=operator.add, *, initial=None)
返回一个迭代器,每次迭代返回累积的结果。
大致相当于:
def accumulate(iterable, func=operator.add, *, initial=None):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], initial=100) --> 100 101 103 106 110 115
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
total = initial
if initial is None:
try:
total = next(it)
except StopIteration:
return
yield total
for element in it:
total = func(total, element)
yield total
例如:
>>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
>>> list(accumulate(data, operator.mul)) # running product
[3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]
>>> list(accumulate(data, max)) # running maximum
[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
# Amortize a 5% loan of 1000 with 4 annual payments of 90
>>> cashflows = [1000, -90, -90, -90, -90]
>>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt))
[1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]
# Chaotic recurrence relation https://en.wikipedia.org/wiki/Logistic_map
>>> logistic_map = lambda x, _: r * x * (1 - x)
>>> r = 3.8
>>> x0 = 0.4
>>> inputs = repeat(x0, 36) # 仅使用初始值
>>> [format(x, '.2f') for x in accumulate(inputs, logistic_map)]
['0.40', '0.91', '0.30', '0.81', '0.60', '0.92', '0.29', '0.79', '0.63',
'0.88', '0.39', '0.90', '0.33', '0.84', '0.52', '0.95', '0.18', '0.57',
'0.93', '0.25', '0.71', '0.79', '0.63', '0.88', '0.39', '0.91', '0.32',
'0.83', '0.54', '0.95', '0.20', '0.60', '0.91', '0.30', '0.80', '0.60']
import itertools
data = [1, 2, 3, 4, 5]
accumulated = itertools.accumulate(data)
print(list(accumulated))
# 输出: [1, 3, 6, 10, 15]
这里默认使用了 operator.add 函数进行累加操作,即第一个元素保持不变,后续元素依次与前一个元素相加。
除了默认的累加操作外,可以指定其他的二元函数进行累积操作,比如乘法:
import itertools
import operator
data = [1, 2, 3, 4, 5]
accumulated = itertools.accumulate(data, operator.mul)
print(list(accumulated))
# 输出: [1, 2, 6, 24, 120]
这里使用了 operator.mul 函数进行累积操作,即每个元素与前一个元素相乘。
也可以使用自定义的函数进行累积操作,例如计算每个元素的平方和:
import itertools
data = [1, 2, 3, 4, 5]
accumulated = itertools.accumulate(data, lambda x, y: x + y**2)
print(list(accumulated))
# 输出: [1, 5, 14, 30, 55]
这里使用了一个自定义的函数 lambda x, y: x + y**2
,每个元素的累积结果是前一个元素与当前元素的平方和。
实际应用场景:
通过 itertools.accumulate() 函数,可以简洁高效地实现各种累积操作,从而简化代码并提高可读性。
更新时间:July 3, 2024, 4:54 p.m. 标签:python itertools accumulate 累积