不使用numpy实现矩阵列交换的Python函数编写问题
问题分析与代码修正
原代码存在的问题
- 函数定义行末尾缺少冒号,属于Python语法错误,直接无法运行
- 变量命名冲突:循环变量
i和传入的参数i重名,会覆盖传入的列下标参数 - 逻辑完全错误:原代码混淆了行和列的下标,实际尝试交换的是
M[i][j]和M[j][i],这是交换矩阵的两个对称位置元素,不是交换整列 - 返回值错误:返回的是临时变量
N,而非修改后的矩阵 - 下标使用错误:
rows = M[i]是取第i行,不是获取矩阵行数,for i in M遍历出来的i是行对象,不能直接当下标使用
修正后的代码
Python原生二维列表是按行存储的,交换两列的核心逻辑是遍历每一行,交换当前行对应列下标的两个元素即可。
版本1:直接修改原矩阵
def swap_columns(M, i, j): # 遍历矩阵的每一行 for row in M: # 交换当前行的第i列和第j列元素 row[i], row[j] = row[j], row[i] # 返回修改后的矩阵 return M
版本2:不修改原矩阵,返回新矩阵
如果不希望改变原始矩阵的内容,可以用这个版本:
def swap_columns(M, i, j): new_matrix = [] for row in M: # 复制当前行避免修改原数据 new_row = row.copy() new_row[i], new_row[j] = new_row[j], new_row[i] new_matrix.append(new_row) return new_matrix
补充说明
如果传入的i、j是从1开始计数的列号(而非Python默认的0基下标),只需要在函数开头添加两行代码转换下标即可:
i -= 1 j -= 1
测试示例
# 测试矩阵 M = [ [1,2,3], [4,5,6], [7,8,9] ] # 交换第0列和第2列 result = swap_columns(M, 0, 2) print(result) # 输出:[[3, 2, 1], [6, 5, 4], [9, 8, 7]]
内容的提问来源于stack exchange,提问作者Agyamarky
相关产品推荐
相关产品推荐

