Python实现矩阵转置后结果与原矩阵相同的问题排查
问题原因
你写的双层循环遍历了矩阵所有n*n个坐标位置,每对需要交换的对称位置元素会被执行两次交换操作,效果完全抵消:
- 第一次循环走到坐标
(i,j)时,mat[i][j]和mat[j][i]完成第一次交换 - 后续循环走到坐标
(j,i)时,这两个位置的元素会被再次交换,回到初始状态
最终输出的矩阵自然和原矩阵没有区别。如果输入的是非方阵,这套写法还会触发索引越界报错。
修复方法
方阵转置不需要遍历所有坐标,只需要遍历主对角线一侧的元素(上三角/下三角区域)即可,避免重复交换,修正后的完整代码如下:
inp = int(input()) mat = [] for i in range(inp): submat = list(map(int,input().split(','))) mat.append(submat) print(mat) n = len(mat) for i in range(n): # j从i+1开始,仅遍历上三角区域,每个元素对仅交换一次 for j in range(i + 1, n): mat[i][j], mat[j][i] = mat[j][i], mat[i][j] print(mat)
如果需要兼容非方阵的转置场景,可以直接用Python内置的zip简化写法,不需要手写双层循环:
# 转置任意维度矩阵 mat = [list(row) for row in zip(*mat)]
内容的提问来源于stack exchange,提问作者Alim
相关产品推荐
相关产品推荐

