如何检查元素的值或它的值邻居(在设定范围内)是否存在列表

How to check if an element's values or it's value neighbors (within a set range) exist a list

我有一个数据变量,包含许多 [x,y] 坐标:

data = ([100,200],[250,110],[50,400]...)

当我收到新的 [x,y] 时,我将其附加到数据中:

data.append ([x_cor, y_cor])

但是

我需要过滤“邻居”坐标(以避免附加它们),在自定义设置“范围”内

例如,如果我将范围设置为 2,那么我需要过滤所有 x 或 y 坐标相同的坐标,或者 less/more 具有 1 或 2 个舍入值的坐标,例如:

101,200

100,199

248,111

50,400

等等...

当范围仅为 1 时,我可以使用 IF 和布尔值通过添加所有变体来实现,如下所示:

cord_exist = False 

if ([x_cor + 1, y_cor + 1]) in data: cord_exist = True
if ([x_cor - 1, y_cor - 1]) in data: cord_exist = True
if ([x_cor + 1, y_cor]) in data: cord_exist = True
if ([x_cor, y_cor + 1]) in data: cord_exist = True
if ([x_cor - 1, y_cor]) in data: cord_exist = True
if ([x_cor, y_cor - 1]) in data: cord_exist = True
if ([x_cor + 1, y_cor - 1]) in data: cord_exist = True
if ([x_cor - 1, y_cor + 1]) in data: cord_exist = True

if cord_exist == False: data.append ([x_cor, y_cor])

如果范围为 2,3 或更大,则无法维护。

如何解决这个问题,可以自由设置范围?

你可以试试这个:

data = [[100,200],[250,110],[50,400]]
new = [103, 403]

margin = 2
if all(abs(d[0] - new[0]) > margin or abs(d[1] - new[1]) > margin for d in data):
    data.append(new)

您可以使用 range 获取所有 'neighbours' x 坐标和类似的所有 'neighbours' y 坐标,并使用 [=13 将它们组合到所有邻居 point 坐标中=].然后你检查数据中的任何现有点是否与你的邻居相匹配

示例代码:

from itertools import product

x_margin, y_margin = 2, 3
x_range = range(x_cor-x_margin, x_cor+x_margin+1)
y_range = range(y_cor-y_margin, y_cor+y_margin+1)
neighbours = set(product(x_range, y_range))
cord_exist = any(cor in neighbours for cor in data)