子列表间隔元素对应求和:现有代码是否最简?有无更Pythonic写法?
更Pythonic的简化写法方案
当然有更简洁、更符合Python风格的写法!咱们先明确你的核心需求:对列表y中的每个子列表,将相邻的两个元素两两配对求和(第1+第2,第3+第4……),最终生成和示例中Total结构一致的结果。
现有写法的可优化点
你当前的代码先拆分出u和t两个中间列表,再通过嵌套循环逐个相加append到Total里,虽然能实现功能,但引入了不必要的中间变量,代码也偏冗长,并不是最简方式。
一行式简化写法(推荐)
直接用嵌套列表推导式结合zip()就能搞定,完全不需要中间变量:
Total = [[a + b for a, b in zip(sub[::2], sub[1::2])] for sub in y]
代码解释:
sub[::2]:取出当前子列表中偶数索引(0、2、4...)的元素(也就是你原来u里的内容)sub[1::2]:取出当前子列表中奇数索引(1、3、5...)的元素(对应原来t里的内容)zip(sub[::2], sub[1::2]):把两组元素两两配对,比如示例中第一个子列表会得到(1,3)、(6,9)、(2,1)- 内层列表推导式直接对每对元素求和,外层遍历
y的所有子列表,最终生成目标结构。
测试你的示例输入:
y = [[1,3,6,9,2,1],[3,8,1,5,6,2]] Total = [[a + b for a, b in zip(sub[::2], sub[1::2])] for sub in y] print(Total) # 输出:[[4, 15, 3], [11, 6, 8]]
完全符合你的预期结果!
处理奇数长度的子列表(可选)
如果你的子列表可能存在长度为奇数的情况(比如最后只剩一个元素),可以用itertools.zip_longest给未配对的元素补0,避免丢失数据:
from itertools import zip_longest Total = [[a + b for a, b in zip_longest(sub[::2], sub[1::2], fillvalue=0)] for sub in y]
比如子列表是[1,2,3],会得到[3, 3](1+2,3+0),而普通zip只会得到[3]。
总结
这种写法不仅代码更紧凑,可读性也更强——一眼就能看出是对每个子列表的元素两两配对求和,完全符合Python推崇的“简洁、直观”的风格,比你当前的写法更Pythonic,也更接近最简方式。
内容的提问来源于stack exchange,提问作者gomulka
相关产品推荐
相关产品推荐

