Python矩阵X形元素翻转代码异常:右上角坐标处理失效
矩阵X形翻转的代码问题
我们用嵌套列表实现了一个n×n矩阵,元素仅为“+”或“-”。需求是:给定转换为0索引的坐标(a, b),翻转该位置及其左上、右上、左下、右下对角位置的元素(X形模式)。
代码在多数场景下正常,但当坐标为右上角(即用户输入的(1, n),对应0索引(0, n-1))时,无法正确翻转(2, n-1)对应的0索引(1, n-2)位置的元素。
示例
输入坐标(1,3)(对应0索引(0,2))时,预期输出:
+ - + + - - + - - - - + - + - to - - - or - - - to - + - + - + + - + + - - - - -
但实际输出:
+ - + + - - + - - - - + - + - to - + - or - - - to - - - + - + + - + + - - - - -
问题代码(Python 3.8)
try: if matrix[a][b] == "+": matrix[a][b] = "-" elif matrix[a][b] == "-": matrix[a][b] = "+" else: pass if matrix[a-1][b-1] == "+" and (a!=0 and b!=0): matrix[a-1][b-1] = "-" elif matrix[a-1][b-1] == "-" and (a!=0 and b!=0): matrix[a-1][b-1] = "+" else: pass if matrix[a-1][b+1] == "+" and a!=0: matrix[a-1][b+1] = "-" elif matrix[a-1][b+1] == "-" and a!=0: matrix[a-1][b+1] = "+" else: pass if matrix[a+1][b-1] == "+" and b!=0: matrix[a+1][b-1] = "-" elif matrix[a+1][b-1] == "-" and b!=0: matrix[a+1][b-1] = "+" else: pass if matrix[a+1][b+1] == "+": matrix[a+1][b+1] = "-" elif matrix[a+1][b+1] == "-": matrix[a+1][b+1] = "+" else: pass except: pass
问题原因
代码核心错误是先访问矩阵元素,再判断索引是否合法。比如处理左下位置(a+1, b-1)时,先执行matrix[a+1][b-1] == "+"再判断b!=0——如果a+1超出矩阵行数,这行代码会触发索引越界异常,被外层except: pass直接跳过,导致该位置翻转逻辑完全不执行。即使索引合法,这种判断顺序也不符合逻辑,应先确认索引在矩阵范围内,再操作元素。
以右上角坐标(0, n-1)为例,要翻转的左下位置是(1, n-2),此时a+1=1(合法)、b-1=n-2(合法),但代码先访问元素再判断条件,若触发潜在异常或逻辑短路,就会跳过翻转。本质是所有对角位置的判断都应先做索引合法性校验。
修正后的代码
n = len(matrix) # 翻转当前位置 if matrix[a][b] == "+": matrix[a][b] = "-" else: matrix[a][b] = "+" # 翻转左上(a-1, b-1) if a > 0 and b > 0: if matrix[a-1][b-1] == "+": matrix[a-1][b-1] = "-" else: matrix[a-1][b-1] = "+" # 翻转右上(a-1, b+1) if a > 0 and b + 1 < n: if matrix[a-1][b+1] == "+": matrix[a-1][b+1] = "-" else: matrix[a-1][b+1] = "+" # 翻转左下(a+1, b-1) if a + 1 < n and b > 0: if matrix[a+1][b-1] == "+": matrix[a+1][b-1] = "-" else: matrix[a+1][b-1] = "+" # 翻转右下(a+1, b+1) if a + 1 < n and b + 1 < n: if matrix[a+1][b+1] == "+": matrix[a+1][b+1] = "-" else: matrix[a+1][b+1] = "+"
修正点说明:
- 先获取矩阵边长
n,用于索引合法性判断 - 每个对角位置都先判断索引是否在矩阵范围内,再执行翻转操作
- 去掉冗余的
else: pass和全局try-except,避免异常被静默忽略,便于排查问题
内容的提问来源于stack exchange,提问作者BlueInundation
相关产品推荐
相关产品推荐

