Python 在二维数组中寻找有效的邻域索引
我有一个Python的2d列表。给定一个索引,我想找到该索引的所有邻居。因此,如果我的列表是Python 在二维数组中寻找有效的邻域索引,python,Python,我有一个Python的2d列表。给定一个索引,我想找到该索引的所有邻居。因此,如果我的列表是3x3,那么给定索引(1,1)我想返回[(0,1)、(1,0)、(2,1)、(1,2)、(2,2)、(0,0)、(0,2)、(2,0)],但是如果索引是(0,0),那么我只想返回[(0,1)、(1,1)]。我知道如何处理丑陋的if语句。我的问题是,有没有一个很好的python magic one liner呢?您当前的代码有多难看?我想不出任何明显的方法来自动完成这项工作,只需手动完成,而不需要编写花哨的
3x3
,那么给定索引(1,1)
我想返回[(0,1)、(1,0)、(2,1)、(1,2)、(2,2)、(0,0)、(0,2)、(2,0)]
,但是如果索引是(0,0)
,那么我只想返回[(0,1)、(1,1)]
。我知道如何处理丑陋的if语句。我的问题是,有没有一个很好的python magic one liner呢?您当前的代码有多难看?我想不出任何明显的方法来自动完成这项工作,只需手动完成,而不需要编写花哨的一行代码。我认为这看起来并不太糟糕:
def find_neighours(index, x_size, y_size):
neighbours = []
x1, y1, = index
for x_move in (-1, 0, 1):
for y_move in (-1, 0, 1):
if x_move == 0 and y_move == 0:
continue
x2, y2 = x1 + x_move, y1 + y_move
if x2 < 0 or x2 >= x_size:
continue
if y2 < 0 or y2 >= y_size:
continue
neighbours.append((x2, y2))
return neighbours
例如,3x3空间的恒定时间解决方案,具有列表理解:
valid={(x,y) for x in range(3) for y in range (3)}
dirs=[(dx,dy) for dx in (-1,0,1) for dy in (-1,0,1) if (dx,dy)!=(0,0)]
def voisins(x,y): return [(x+dx,y+dy) for (dx,dy) in dirs if (x+dx,y+dy) in valid]
是的,这正是我目前正在做的。我希望会有类似于导入邻居的东西:)我想你可能已经有了类似的东西,希望它能成为其他人改进的一个不错的基准。
valid={(x,y) for x in range(3) for y in range (3)}
dirs=[(dx,dy) for dx in (-1,0,1) for dy in (-1,0,1) if (dx,dy)!=(0,0)]
def voisins(x,y): return [(x+dx,y+dy) for (dx,dy) in dirs if (x+dx,y+dy) in valid]