You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 边界处理:先判断空矩阵或每行都为空的情况,直接返回空列表,避免后续索引报错。
  2. 行列数确认:明确原矩阵的行数和列数,而非默认两者相等。
  3. 转置矩阵初始化:根据原矩阵的列数创建对应数量的空列表,作为转置矩阵的行。
  4. 元素收集逻辑:外层循环遍历原矩阵的列索引,内层循环遍历行索引,逐个收集当前列的元素,确保不会出现索引越界(因为列索引范围严格控制在原矩阵的列数范围内,行索引控制在原矩阵的行数范围内)。

测试示例

# 测试方阵
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:35:30