详解Python双层列表推导式实现矩阵转置的分步执行过程
详解Python双层列表推导式实现矩阵转置的原理
先明确我们的基础数据和目标代码:
原矩阵:
matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ]
实现转置的列表推导式:
transposed_matrix = [[row[i] for row in matrix] for i in range(4)]
先把列表推导式“展开”成普通循环,更容易理解
其实这个双层列表推导式就是嵌套for循环的紧凑写法,展开后是这样的:
transposed_matrix = [] # 外层循环:遍历原矩阵的列索引 for i in range(4): current_transposed_row = [] # 内层循环:遍历原矩阵的每一行 for row in matrix: # 取出当前行的第i个元素(也就是原矩阵的第i列元素) current_transposed_row.append(row[i]) # 把收集好的列元素作为转置矩阵的一行加进去 transposed_matrix.append(current_transposed_row)
分步拆解每一轮循环的执行过程
矩阵转置的核心逻辑是:把原矩阵的第i列,变成转置矩阵的第i行,我们跟着循环一步步走:
当i=0时(处理原矩阵的第0列)
遍历matrix的每一行,依次取出每行索引为0的元素:- 第一行
[1,2,3,4]取row[0]→ 1 - 第二行
[5,6,7,8]取row[0]→ 5 - 第三行
[9,10,11,12]取row[0]→ 9
收集到的current_transposed_row是[1,5,9],添加到transposed_matrix后,此时结果是[[1,5,9]]
- 第一行
当i=1时(处理原矩阵的第1列)
同样遍历每一行取索引1的元素:- 第一行取2,第二行取6,第三行取10
收集到[2,6,10],添加后结果变成[[1,5,9], [2,6,10]]
- 第一行取2,第二行取6,第三行取10
当i=2时(处理原矩阵的第2列)
取出每行索引2的元素:3、7、11
收集到[3,7,11],添加后结果是[[1,5,9], [2,6,10], [3,7,11]]当i=3时(处理原矩阵的第3列)
取出每行索引3的元素:4、8、12
收集到[4,8,12],添加后最终得到完整的转置矩阵:[[1,5,9], [2,6,10], [3,7,11], [4,8,12]]
核心原理总结
这个双层列表推导式的逻辑是:
- 外层循环
for i in range(4):控制我们要提取原矩阵的哪一列(i就是列索引) - 内层循环
for row in matrix:遍历原矩阵的每一行,取出当前行的第i个元素 - 把同一列的所有元素收集成一个列表,这个列表就是转置矩阵的一行
另外提个小细节:这里range(4)是因为原矩阵每行有4个元素(也就是4列),如果原矩阵的列数变化,这个数字也要对应调整哦。
内容的提问来源于stack exchange,提问作者Deep




