求助:Python 3中嵌套列表推导式内3个for循环的执行逻辑解析
理解嵌套列表推导式中的多层for循环
嘿,我明白这种嵌套列表推导式看起来确实有点让人头大——尤其是一堆for挤在一起的时候。别担心,咱们把它拆成你熟悉的普通for循环,就能一眼看明白三个循环的协同逻辑了。
首先,先把你给出的表达式转换成等价的普通嵌套循环,这是理解它的关键:
result = [] # 最外层循环:遍历pre中的每个元素a for a in pre: total = 0 # 中间层循环:把s和a对应位置的元素配对,遍历每一对(y, b) for y, b in zip(s, a): # 最内层循环:把y和b对应位置的元素配对,遍历每一对(z, c) for z, c in zip(y, b): total += abs(z - c) result.append(total)
现在是不是清晰多了?这三个for循环不是独立语句,而是嵌套执行的,顺序和上面的普通循环完全一致:
- 第一步:最外层循环先取
pre里的一个元素a; - 第二步:针对这个
a,中间层循环遍历zip(s, a)生成的每一对(y, b)(y来自s,b来自a); - 第三步:针对每一对
(y, b),最内层循环遍历zip(y, b)生成的每一对(z, c)(z来自y,c来自b),计算abs(z - c)并累加; - 当最内层和中间层循环都跑完,得到当前
a对应的总和,把它加入结果列表; - 重复这个过程,直到
pre里的所有a都处理完。
举个实际的小例子
为了更直观,咱们给s和pre赋具体的值:
s = [[1, 2], [3, 4]] pre = [[[1, 1], [3, 3]], [[0, 2], [5, 4]]]
按照上面的循环逻辑:
- 处理第一个
a = [[1,1], [3,3]]:zip(s, a)得到两对:([1,2], [1,1])和([3,4], [3,3])- 第一对
(y=[1,2], b=[1,1]):zip(y,b)得到(1,1)和(2,1),abs值是0和1,累加得1 - 第二对
(y=[3,4], b=[3,3]):zip(y,b)得到(3,3)和(4,3),abs值是0和1,累加得1
- 第一对
- 总和是1+1=2,加入结果列表
- 处理第二个
a = [[0,2], [5,4]]:zip(s, a)得到两对:([1,2], [0,2])和([3,4], [5,4])- 第一对
(y=[1,2], b=[0,2]):zip(y,b)得到(1,0)和(2,2),abs值是1和0,累加得1 - 第二对
(y=[3,4], b=[5,4]):zip(y,b)得到(3,5)和(4,4),abs值是2和0,累加得2
- 第一对
- 总和是1+2=3,加入结果列表
最终结果就是[2, 3],和你原来的列表推导式运行结果完全一致。
总结一下:列表推导式里的多个for循环是从左到右依次嵌套的,和你写普通嵌套for循环的逻辑完全一样,只是把代码压缩成了一行而已。
内容的提问来源于stack exchange,提问作者lucifer
相关产品推荐
相关产品推荐

