技术求助:如何交换二维数组中主对角线对称位置的元素?
二维方阵主对角线对称元素交换问题的修正方案
现有代码的核心问题
- 函数未封装必要参数:
obmen直接依赖全局变量n和A,调用时易因变量未定义报错,不符合代码规范。 - 对称位置计算错误:主对角线对称元素的位置应为行下标与列下标互换(即
A[i][j]对应A[j][i]),原代码中的A[n-j+1][n-i+1]是针对副对角线的计算逻辑,完全偏离需求。 - 循环范围逻辑混乱:原循环的范围与条件判断无法准确覆盖需要交换的元素,会导致漏交换或重复交换。
正确实现方案
核心逻辑:对于n阶方阵,只需遍历主对角线右上方(i < j)的元素,与左下方的对称位置(j, i)交换,避免重复操作。
def swap_main_diag_sym(A): n = len(A) # 遍历主对角线右上方的元素,每个对称对仅交换一次 for i in range(n): for j in range(i + 1, n): # 直接交换对称位置元素,无需临时变量 A[i][j], A[j][i] = A[j][i], A[i][j] # 格式化打印结果 for row in A: print(' '.join(f'{num:.3f}' for num in row)) return A # 示例调用 if __name__ == "__main__": test_matrix = [ [1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0] ] swapped_matrix = swap_main_diag_sym(test_matrix)
代码要点说明
- 参数鲁棒性:通过
len(A)自动获取方阵阶数n,无需额外传入,适配任意阶数的方阵。 - 循环优化:仅处理
i < j的元素,确保每个对称元素对只交换一次,避免重复操作。 - 简洁交换:利用Python元组解包特性直接完成元素交换,省去临时变量的定义。
- 打印优化:用
join结合生成器表达式简化格式化打印逻辑,输出更整洁。
内容的提问来源于stack exchange,提问作者Fecozoo
相关产品推荐
相关产品推荐

