You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:36:03