Python 在二维数组中寻找有效的邻域索引

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呢?您当前的代码有多难看?我想不出任何明显的方法来自动完成这项工作,只需手动完成,而不需要编写花哨的

我有一个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呢?

您当前的代码有多难看?我想不出任何明显的方法来自动完成这项工作,只需手动完成,而不需要编写花哨的一行代码。我认为这看起来并不太糟糕:

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]