如何自定义邻域范围,校验二维坐标及其相近值是否存在于列表中
可配置邻域范围的坐标过滤实现方案
核心逻辑
你需要的邻域过滤本质是校验新坐标与已有坐标的x轴差值绝对值和y轴差值绝对值是否都小于等于自定义范围,无需手动枚举所有偏移组合。
实现代码
方案1:遍历已有坐标校验(适合数据量小、邻域范围大的场景)
# 自定义邻域范围,可自由修改 neighbor_range = 2 cord_exist = False for (x_exist, y_exist) in data: if abs(x_exist - x_cor) <= neighbor_range and abs(y_exist - y_cor) <= neighbor_range: cord_exist = True break # 命中就提前终止,减少不必要的遍历 if not cord_exist: data.append([x_cor, y_cor])
方案2:集合查询校验(适合数据量大、邻域范围小的场景,性能更高)
提前将坐标转为元组存入集合,利用集合O(1)的查询速度提升效率,无需每次遍历全量数据:
# 初始化时同步维护一个坐标集合,后续新增坐标时同步更新即可 data_set = set(tuple(coord) for coord in data) # 自定义邻域范围 neighbor_range = 2 cord_exist = False # 遍历所有偏移组合,查询是否有命中的已有坐标 for dx in range(-neighbor_range, neighbor_range + 1): for dy in range(-neighbor_range, neighbor_range + 1): if (x_cor + dx, y_cor + dy) in data_set: cord_exist = True break if cord_exist: break if not cord_exist: data.append([x_cor, y_cor]) data_set.add((x_cor, y_cor)) # 同步更新集合,保证后续查询正确性
补充说明
- 两种方案都默认覆盖了「新坐标本身已经存在于data中」的过滤逻辑,符合你示例中完全相等的坐标也会被拦截的需求
- 如果你的过滤规则是仅x或y任意一个差值在范围内就拦截,只需把判断条件里的
and改成or即可
内容的提问来源于stack exchange,提问作者D.Moore
相关产品推荐
相关产品推荐

