You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:57:11