Python3函数式编程:基于另一列表向初始值累加生成新列表
优化累加列表生成的方案
嘿,先提个小问题:你当前的代码里有个索引错误——循环用了enumerate(x)拿到k, v,但里面却用了没定义的i,这会直接报错哦。先把这个bug修正的话,符合你需求的基础版本应该是这样:
def func(): x = [0, 1, 2, 1, 3, 1, 1] y = [3] for num in x[1:]: # 按照你说的从x第2个元素开始累加 y.append(y[-1] + num) return y
接下来聊聊更高效、更易懂的实现方式,正好可以用你提到的itertools工具包,里面的accumulate就是专门做这类累加操作的,能让代码简洁不少:
方案1:用itertools.accumulate实现
accumulate函数会生成一个累加的迭代器,我们只需要把初始值和要累加的增量序列组合好就行。具体代码如下:
from itertools import accumulate def optimized_func(): x = [0, 1, 2, 1, 3, 1, 1] initial_value = 3 # 取x从第2个元素开始的所有值作为累加增量 increments = x[1:] # 把初始值和增量序列合并,accumulate默认会做加法累加 accumulated_sequence = accumulate([initial_value] + increments) # 把迭代器转成列表返回 return list(accumulated_sequence)
运行这个函数会得到[3, 4, 6, 7, 10, 11, 12],完全符合你的需求。而且accumulate是用C实现的底层函数,比纯Python循环效率更高,尤其是当x的元素数量很大的时候,性能优势会更明显。
方案2:用生成器实现(无需导入库)
如果你不想依赖itertools,也可以用生成器表达式来实现,代码同样简洁,还支持惰性求值(如果不需要一次性生成整个列表,能节省内存):
def generate_accumulated_list(): x = [0, 1, 2, 1, 3, 1, 1] current = 3 yield current # 先返回初始值 for num in x[1:]: current += num yield current # 调用时转成列表 result = list(generate_accumulated_list())
小提示:灵活调整累加起点
如果后续需求变化,需要从x的第一个元素(也就是x[0])开始累加,只需要把代码里的x[1:]改成x就行,不管用哪种方案都能快速调整。
内容的提问来源于stack exchange,提问作者krishnab
相关产品推荐
相关产品推荐

