2015-04-28 73 views
2

我在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,0), (1, 1)]。我知道如何用醜陋的陳述來做到這一點。我的問題是,這有一個漂亮的Pythonic魔術襯墊嗎?在二維數組中找到有效的鄰居索引

回答

2

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] 
1

你目前的代碼有多醜?我想不出任何明顯的方式來自動地做到這一點,只是做手工,但不嘗試寫看上一眼襯裏,我不認爲它看起來太糟糕了:

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 

輸出:

find_neighours((1, 1), 3, 3) 
Out[2]: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1), (2, 2)] 

find_neighours((0, 0), 3, 3) 
Out[3]: [(0, 1), (1, 0), (1, 1)] 
+0

是的這正是我目前正在做的。我希望有像導入鄰居:) –

+0

我想你可能已經有類似的東西,希望它可以作爲一個體面的基線,讓其他人改善。 – Marius