为何代码nova_linha.append(matriz[i][j])行出现List index out of range错误?
为什么你的矩阵转置代码会出现List index out of range错误?
嘿,我来帮你拆解这个问题~你的代码出现索引越界的核心原因是循环逻辑完全搞反了,而且手动修改循环变量导致索引超出了矩阵的范围,具体问题和修正方案如下:
问题分析
先看你代码里的几个关键错误点:
- 转置矩阵的逻辑应该是按列取元素,把原矩阵的每一列元素组成转置后的一行,但你现在的循环是先遍历行(
i)再遍历列(j),方向完全反了。 - 你在内部循环里手动执行了
i+=1,这会让i的增长不受外层循环控制。举个例子:如果原矩阵是3行,外层循环初始i=0,进入内部循环后,第一次j循环时i变成1,第二次j循环i变成2,第三次j循环i就变成3了——而原矩阵的行索引最大是2,这时候访问matriz[i]自然就会触发List index out of range。 - 最后一行的
j+=1完全多余,因为内部的for j in range(...)已经会自动迭代j的值,手动修改只会打乱逻辑。
修正后的代码
方式1:修正循环逻辑(贴合你的原始思路)
我们调整循环顺序,先遍历原矩阵的列,再遍历行,同时去掉多余的手动变量修改:
def transpor_matriz(matriz): transposta = [] # 先遍历原矩阵的列数(假设矩阵是规整的,每行长度相同) for j in range(len(matriz[0])): nova_linha = [] # 再遍历原矩阵的行数 for i in range(len(matriz)): nova_linha.append(matriz[i][j]) transposta.append(nova_linha) return transposta
方式2:Python简洁写法(推荐)
用Python内置的zip函数可以一行搞定矩阵转置(注意如果是列表的列表,需要把zip的结果转成列表):
def transpor_matriz(matriz): return [list(coluna) for coluna in zip(*matriz)]
解释:*matriz会把原矩阵的每一行拆成独立的参数传给zip,zip会按位置把每行的元素配对,也就是拿到原矩阵的每一列,最后转成列表即可。
内容的提问来源于stack exchange,提问作者G.C.
相关产品推荐
相关产品推荐

