很多时候我们会遇到需要计算前缀和的情况,python为我们提供了一个计算前缀和的函数(这个函数除了计算前缀和之外还可以处理其他的情况):itertools.accumulate(iterable[, func, *, initial=None]),函数中的参数有三个,第一个参数为传递的迭代器参数,第二个参数为func函数,可以为max、min或者是operator.mul(),第三个参数是一开始计算的参数,下面是python官方文档的相关介绍:
accumulate函数创建一个迭代器,返回累积汇总值或其他双目运算函数的累积结果值(通过可选的 func 参数指定)。如果提供了 func,它应当为带有两个参数的函数。 输入 iterable 的元素可以是能被 func 接受为参数的任意类型。(例如,对于默认的加法运算,元素可以是任何可相加的类型包括 Decimal 或 Fraction。)通常,输出的元素数量与输入的可迭代对象是一致的。 但是,如果提供了关键字参数 initial,则累加会以 initial 值开始,这样输出就比输入的可迭代对象多一个元素。func 参数有几种用法。它可以被设为 min() 最终得到一个最小值,或者设为 max() 最终得到一个最大值,或设为 operator.mul() 最终得到一个乘积。摊销表可通过累加利息和支付款项得到。给iterable设置初始值并只将参数 func 设为累加总数可以对一阶递归关系建模。
python3.8的官方文档的描述:https://docs.python.org/zh-cn/3.8/library/itertools.html#itertools.accumulate
下面是具体的例子,因为函数的返回值是一个迭代器,所以可以使用list函数将其转换为list列表进行输出,这样就可以输出具体的结果方便查看或者是做进一步的处理:
import itertools
import operator
if __name__ == '__main__':
data = [1, 2, 3, 4, 5]
# 计算前缀和
print(list(itertools.accumulate(data)))
# 计算到当前位置累积相乘得结果
data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
print(list(itertools.accumulate(data, operator.mul, initial=2)))
# 计算到当前位置的最大值并且输出
print(list(itertools.accumulate(data, max)))