如何在嵌套列表中检测2x2 G区块并修复索引错误
问题修复:检测并替换2x2 G区块的索引错误
核心问题分析
- 索引越界根源:你在判断条件中先访问了
lst[row][col+1],再做边界检查col + 1 < len(lst_row)。当col是当前行的最后一个索引时,col+1已经超出列表范围,直接访问会触发IndexError。必须先做边界检查,再访问元素。 - 赋值错误:你用了比较运算符
==而非赋值运算符=,等于没有修改任何值。 - 引用无效:
item、right等是原列表元素的临时引用,修改这些变量不会同步到原列表,必须直接通过列表索引修改元素。
修复后的代码
lst = [["S", "V", "G", "S"], ["V", "G", "S", "V"], ["V", "G", "G", "S"], ["V", "V", "V", "V"]] for row, lst_row in enumerate(lst): # 只遍历到倒数第二行,避免row+1越界 if row >= len(lst) - 1: break # 只遍历到倒数第二列,避免col+1越界 for col in range(len(lst_row) - 1): current = lst[row][col] right = lst[row][col+1] down = lst[row+1][col] down_right = lst[row+1][col+1] # 检查是否为2x2的G区块 if current == right == down == down_right == "G": # 直接修改原列表的对应位置 lst[row][col] = "X" lst[row][col+1] = "X" lst[row+1][col] = "X" lst[row+1][col+1] = "X" # 打印验证结果 for row in lst: print(" ".join(row))
关键修改说明
- 外层循环限制遍历到倒数第二行,内层循环限制遍历到倒数第二列,从根源杜绝索引越界;
- 通过列表索引直接修改元素,确保修改同步到原列表;
- 用链式比较简化条件判断,逻辑更清晰;
- 明确只匹配值为
"G"的2x2区块,符合需求。
运行结果
S V G S V X X V V X X S V V V V
内容的提问来源于stack exchange,提问作者vAlkanol
相关产品推荐
相关产品推荐

