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

子列表间隔元素对应求和:现有代码是否最简?有无更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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:19:17