10x10网格查找单元格邻居Python代码返回无效坐标问题排查
问题原因
你代码的核心错误是在遍历列表的过程中直接对原列表执行删除操作:Python遍历列表时是按索引顺序迭代的,删除某个元素后,列表后续元素的索引都会向前挪一位,会导致下一次迭代直接跳过紧挨被删元素后面的那个元素,没有做边界校验,这些漏检的无效坐标就留在了结果里。
比如(0,0)生成的初始邻居列表中,(-1,0)是第二个元素,遍历到它时触发删除逻辑,原本下一个要检查的第三个元素(0,1)就变成了新的第二个元素,迭代器直接跳到了第三个位置的元素,最终漏检了后面的(-1,1)这类无效坐标。
修复方案
推荐使用列表推导式直接生成过滤后的合法邻居列表,逻辑最简洁清晰,也不会出现遍历删元素的异常:
X = 10 Y = 10 class Cell: def __init__(self,x,y) -> None: self.coordinates = (x,y) self.neighbors = self.find_neighbors() # 顺便修正原代码拼写错误neigbors→neighbors def find_neighbors(self): x,y = self.coordinates # 生成所有8方向坐标 all_directions = [ (x+1,y),(x-1,y),(x,y+1),(x,y-1),(x+1,y+1), (x+1,y-1),(x-1,y+1),(x-1,y-1) ] # 直接过滤出符合边界要求的坐标 valid_neighbors = [ (nx, ny) for nx, ny in all_directions if 0 <= nx < X and 0 <= ny < Y ] return valid_neighbors
如果你一定要保留删除的逻辑,也可以改为遍历初始邻居列表的副本,对原列表执行删除操作,就不会出现漏检问题:
def find_neighbors(self): x,y = self.coordinates neighbors = [ (x+1,y),(x-1,y),(x,y+1),(x,y-1),(x+1,y+1), (x+1,y-1),(x-1,y+1),(x-1,y-1) ] # 遍历neighbors的副本,而不是原列表 for neighbor in list(neighbors): if neighbor[0] < 0 or neighbor[1] < 0 or neighbor[0] >= X or neighbor[1] >= Y: neighbors.remove(neighbor) return neighbors
验证结果
修复后测试两个用例输出完全符合预期:
Cell(0,0).neighbors输出为[(1, 0), (0, 1), (1, 1)]Cell(9,9).neighbors输出为[(8, 9), (9, 8), (8, 8)]
内容的提问来源于stack exchange,提问作者Sanawar
相关产品推荐
相关产品推荐

