Python中更优雅的2D网格坐标范围(0到max_x、0到max_y)校验方法
更优雅的2D网格邻域坐标边界校验方案
你现在先全量生成8邻域坐标再反向pop删越界值的做法可行,但确实不够简洁。其实可以直接在列表推导式里嵌入边界校验条件,一步生成符合要求的邻域列表,完全省去后续的删除操作。
直接在推导式中过滤
这是最直观的优化方式,把边界判断和邻域生成放在同一逻辑里:
max_x = 10 max_y = 12 neighbors = [ [x+i, y+j] for i in (-1, 0, 1) for j in (-1, 0, 1) if (i != 0 or j != 0) # 排除单元格自身 and 0 <= x+i < max_x # 校验x坐标在合法范围 and 0 <= y+j < max_y # 校验y坐标在合法范围 ]
这里假设网格坐标是从(0,0)到(max_x-1, max_y-1),如果你的边界规则是包含max_x和max_y,把<改成<=即可。
抽离校验逻辑(适合复杂场景)
如果网格的边界规则可能变化,或者需要多处复用校验逻辑,可以把边界判断抽成独立函数,代码可读性和维护性会更好:
def coord_in_bounds(coord, max_x, max_y): cx, cy = coord return 0 <= cx < max_x and 0 <= cy < max_y max_x = 10 max_y = 12 neighbors = [ [nx, ny] for i in (-1, 0, 1) for j in (-1, 0, 1) if (i != 0 or j != 0) and coord_in_bounds((x+i, y+j), max_x, max_y) ]
这两种方式都比先全量生成再删除的做法更高效,也更符合Python的简洁风格——毕竟列表推导式本身就擅长“生成+过滤”的组合逻辑。
内容的提问来源于stack exchange,提问作者futurebird
相关产品推荐
相关产品推荐

