Python实现矩阵转置(无numpy/zip):解决列表索引越界问题
解决非方阵矩阵转置的索引越界问题
问题根源
你之前的代码只能处理方阵,核心原因是默认了矩阵的行数和列数相等。当处理非方阵时,转置后的矩阵行数等于原矩阵的列数、列数等于原矩阵的行数,若仍按方阵的行列数逻辑循环,必然会出现索引越界。
修正后的实现代码
def transpose_matrix(matrix): # 处理空矩阵或单行空矩阵的边界情况 if not matrix or not matrix[0]: return [] # 获取原矩阵的行数和列数 row_count = len(matrix) col_count = len(matrix[0]) # 初始化转置矩阵:行数等于原列数,每行先为空列表 transposed = [[] for _ in range(col_count)] # 遍历原矩阵的每一列,收集该列所有元素作为转置矩阵的一行 for col_idx in range(col_count): for row_idx in range(row_count): transposed[col_idx].append(matrix[row_idx][col_idx]) return transposed
代码说明
- 边界处理:先判断空矩阵或每行都为空的情况,直接返回空列表,避免后续索引报错。
- 行列数确认:明确原矩阵的行数和列数,而非默认两者相等。
- 转置矩阵初始化:根据原矩阵的列数创建对应数量的空列表,作为转置矩阵的行。
- 元素收集逻辑:外层循环遍历原矩阵的列索引,内层循环遍历行索引,逐个收集当前列的元素,确保不会出现索引越界(因为列索引范围严格控制在原矩阵的列数范围内,行索引控制在原矩阵的行数范围内)。
测试示例
# 测试方阵 square_mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(transpose_matrix(square_mat)) # 输出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]] # 测试非方阵(2行3列) rect_mat = [[1, 2, 3], [4, 5, 6]] print(transpose_matrix(rect_mat)) # 输出: [[1, 4], [2, 5], [3, 6]]
错误代码的典型问题
如果你的原有代码类似下面这种方阵专用逻辑,就会在非方阵场景报错:
# 错误示例:仅支持方阵 def wrong_transpose(matrix): n = len(matrix) transposed = [[0]*n for _ in range(n)] for i in range(n): for j in range(n): transposed[j][i] = matrix[i][j] return transposed
这种代码硬编码了转置矩阵的行列数等于原矩阵的行数,当原矩阵行列数不等时,要么初始化的转置矩阵尺寸错误,要么循环时访问了不存在的索引。
内容的提问来源于stack exchange,提问作者UlyssesJA
相关产品推荐
相关产品推荐

