使用一行嵌套列表推导式处理二维列表运算与子列表求和问题
解决二维列表元素运算并按子列表求和的问题
嘿,我懂你遇到的困扰了——你之前写的列表推导式把二维列表直接展平成一维了,自然没法按原来的子列表分组求和对吧?
问题根源
你写的b = [y*exp(-y) for x in a for y in x]用了同一层级的两层循环,这会把原二维列表里的所有元素都平铺到一个一维列表里,破坏了原有的子列表结构,所以后续没法按子列表求和。
正确解决方法
我们需要用嵌套的列表推导式来保持原列表的二维结构,分两种场景:
1. 先得到二维列表b,再求和得到c
先保留每个子列表的结构,对每个子列表里的元素单独运算:
from math import exp a = [[4, 3, 1], [-1, -2, -3]] # 生成二维结果列表b b = [[y * exp(-y) for y in sublist] for sublist in a] # 对b的每个子列表求和得到c c = [sum(sublist) for sublist in b]
运行后:
b的结果是[[0.07326, 0.14936, 0.36788], [-2.71828, -14.77811, -60.25661]](保留了原二维结构)c的结果是[0.59049, -77.753],和你给出的示例一致。
2. 一步到位直接生成列表c
如果不需要保留中间结果b,可以直接把每个子列表的运算和求和合并成一行推导式:
from math import exp a = [[4, 3, 1], [-1, -2, -3]] c = [sum(y * exp(-y) for y in sublist) for sublist in a]
这里内层用了生成器表达式(没有方括号)传给sum(),比先生成子列表再求和更高效,最终直接得到你想要的求和结果。
核心要点
列表推导式的层级决定了结果的结构:外层循环对应原列表的子列表,内层循环/生成器对应子列表的元素,这样就能完美保留原有的二维分组,而不会被展平。
内容的提问来源于stack exchange,提问作者Camilo Ruiz
相关产品推荐
相关产品推荐

