Python如何使用reduce实现嵌套列表逐位置累加归约
实现方法
你的判断是对的,from functools import reduce导入的reduce完全适配这个场景。你原有循环的问题是每轮计算都直接读取原始输入的子列表做相加,没有复用上一轮累加得到的结果,导致输出不符合预期。
reduce 正确实现
reduce的核心逻辑就是逐轮处理序列元素,把上一轮函数的返回值作为下一轮函数的第一个入参,刚好匹配「上一轮累加结果作为下一轮计算基准」的需求。因为reduce默认只返回最终计算结果,我们只需要在累加逻辑里额外收集每轮的中间结果即可。
from functools import reduce def test_reduce_lists_by_summing_them(): """ 将首个列表的每个元素与后续列表同位置元素依次相加,每轮计算得到的结果作为下一轮计算的首个列表,同时追加到返回的结果列表中。 """ input_ = [[1, 0, 0], [0, 1, 0], [0, 0, 2], [3, 0, 0]] expected_output = [[1, 1, 0], [1, 1, 2], [4, 1, 2]] intermediate_results = [] def accumulator(prev_sum, next_list): # 计算当前轮次两个列表的同位置元素和 current_sum = [a + b for a, b in zip(prev_sum, next_list)] # 把当前轮结果存入结果集 intermediate_results.append(current_sum) # 返回当前累加和,作为下一轮计算的基准值 return current_sum # 初始累加基准为输入的第一个子列表,依次处理后续所有子列表 reduce(accumulator, input_[1:], input_[0]) assert intermediate_results == expected_output
关键逻辑说明:
- 给
reduce传入第三个参数作为初始累加值,直接取输入的第一个子列表,避免首轮读取错误的原始值 - 累加函数每轮返回的
current_sum会自动作为下一轮的prev_sum入参,不需要手动维护迭代变量 - 额外定义的
intermediate_results专门用来收集每轮的计算结果,最终值就是预期输出
修正后的循环版本
如果不用reduce,只要手动维护一个存储上一轮累加结果的变量,就能修正你原有循环的问题:
def test_loop_lists_by_summing_them(): input_ = [[1, 0, 0], [0, 1, 0], [0, 0, 2], [3, 0, 0]] expected_output = [[1, 1, 0], [1, 1, 2], [4, 1, 2]] output = [] # 初始化累加基准为第一个子列表 current = input_[0] for next_list in input_[1:]: current = [a + b for a, b in zip(current, next_list)] output.append(current) assert output == expected_output
内容的提问来源于stack exchange,提问作者jjk
相关产品推荐
相关产品推荐

