如何将嵌套列表的和传递给下一个列表?原列表需保持不变
问题分析与解决方案
问题描述
给定原始列表:
my_list = [[3, 4, -1], [0, 1], [-2], [7, 5, 8]]
需求:将第i个嵌套列表的求和结果追加到第i+1个嵌套列表的右侧(类似接力传递),原列表必须保持原样且不允许复制,期望输出:
wanted = [[3, 4, -1], [0, 1, 6], [-2, 7], [7, 5, 8, 5]]
尝试的代码及错误输出:
from itertools import pairwise wanted = [] for left, right in pairwise(my_list): wanted.extend([left, right + [sum(left)]]) print(wanted) # 错误输出:[[3, 4, -1], [0, 1, 6], [0, 1], [-2, 1], [-2], [7, 5, 8, -2]]
错误原因
pairwise(my_list)会生成连续元素对:([3,4,-1], [0,1])、([0,1], [-2])、([-2], [7,5,8])- 每次循环用
extend把left和修改后的right都塞进wanted,导致原列表的中间元素(比如[0,1]、[-2])被重复添加,最终列表长度变成6,远超原列表的4个元素 - 这段代码没处理原列表最后一个元素的保留逻辑,仅靠最后一组对的
right添加,但前面的重复元素已经导致结构完全混乱
解决方案
基础实现
逐个构建目标列表,确保原列表不受影响:
my_list = [[3, 4, -1], [0, 1], [-2], [7, 5, 8]] wanted = [] # 直接保留原列表第一个子列表(不修改原数据) wanted.append(my_list[0]) # 遍历从第二个到最后一个的子列表,生成带前一个求和结果的新列表 for i in range(1, len(my_list)): prev_total = sum(my_list[i-1]) # 用原列表子列表拼接求和结果,生成新列表加入wanted,不改动原列表 wanted.append(my_list[i] + [prev_total]) print(wanted) # 输出:[[3, 4, -1], [0, 1, 6], [-2, 7], [7, 5, 8, 5]]
简洁实现(列表推导式)
先预计算所有子列表的和,再通过列表推导式快速构建结果:
my_list = [[3, 4, -1], [0, 1], [-2], [7, 5, 8]] # 先算出每个子列表的求和结果 sub_sums = [sum(sublist) for sublist in my_list] # 第一个元素直接取原列表,后面的元素拼接前一个的求和结果 wanted = [my_list[0]] + [my_list[i] + [sub_sums[i-1]] for i in range(1, len(my_list))] print(wanted)
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

