2017-09-05 32 views
0

我想要做的是有一個2D數組,並且對於數組中的每個座標,如果它們存儲了1或0,請求其周圍的所有其他8個座標。類似於尋找地雷的掃雷。如何添加到python中的網格座標?

我曾經有過這樣的:

grid = [] 

for fila in range(10): 
    grid.append([]) 
    for columna in range(10): 
     grid[fila].append(0) 

#edited 
for fila in range (10): 
    for columna in range (10): 
     neighbour = 0 
     for i in range 10: 
      for j in range 10: 

       if gird[fila + i][columna + j] == 1 
        neighbour += 1 

可是事情並沒有很好地工作。我也有打印語句來試圖找到這樣的錯誤,但我仍然不明白爲什麼它只做了for循環的一半。所以我改變了這第二個for循環:

#edited 
for fila in range (10): 
    for columna in range (10): 
     neighbour = 0 

     if grid[fila - 1][columna - 1] == 1: 
      neighbour += 1 
     if grid[fila - 1][columna] == 1: 
      neighbour += 1 
     if grid[fila - 1][columna + 1] == 1: 
      neighbour += 1 
     if grid[fila][columna - 1] == 1: 
      neighbour += 1 
     if grid[fila][columna + 1] == 1: 
      neighbour += 1 
     if grid[fila + 1][columna - 1] == 1: 
      neighbour += 1 
     if grid[fila + 1][columna] == 1: 
      neighbour += 1 
     if grid[fila + 1][columna + 1] == 1: 
      neighbour += 1 

而得到這個錯誤:

if grid[fila - 1][columna + 1] == 1: 
IndexError: list index out of range 

好像我無法在網格中添加座標,但是我可以減去。這是爲什麼?

+0

你檢查的邊界?例如第一排沒有上鄰居。您通常在這些鄰居檢查的外部有額外的'''> 0'''和'''i sascha

+0

首先,如果你想創建這樣的規則數組,你應該切換到'numpy'。你的第一個雙循環將是一行:'grid = numpy.zeros((10,10))''。這就是說,我並沒有真正遵循你的代碼的邏輯。首先你使用'filea'和'columna'作爲循環索引,然後用作數組索引的偏移量 - 我不認爲這是你真正想要的。你可以從'filea'和'columna'減1的原因是,在初始循環之後它們都等於'9','9 + 1 = 10'超出邊界。 –

+0

omg sry我忘了寫在問題編輯的東西,並會更有意義 –

回答

-1

錯誤正是它說,你需要檢查座標適合在網格內:

0 <= i < 10 and 0 <= j < 10 

否則你試圖訪問一個不存在於內存中的元素,或元素不是你實際想到的元素--Python處理負向索引,它們從最後算起。

E.g. a[-1]是最後一個元素,與a[len(a) - 1]完全一樣。

0

Python中的有效索引是-len(grid)len(grid)-1。積極的指標是訪問元素與前面的偏移量,負面的來自後面。如果索引大於您看到的len(grid)-1,則添加時會出現範圍錯誤。除非您得到的索引值小於-len(grid),否則相減不會導致範圍錯誤。雖然你不檢查下限,這是0(零)它似乎適用於你,因爲小負指數從後端返回值。這是導致錯誤鄰居結果的無聲錯誤。

+0

這將是有道理的,如果我只有在數組的邊界上的錯誤,但我有第一個for循環是,即使在中間,座標只能看到左上角和左上角的相鄰座標。它是否在其他地方拖動錯誤? –

+0

請發佈顯示錯誤的完整代碼。 – stefan

0

如果您要計算偏移量,則需要確保偏移量位於列表的範圍內。所以如果你有10個元素,不要試圖訪問第11個元素。

import collections 

grid_offset = collections.namedtuple('grid_offset', 'dr dc') 

Grid = [[0 for c in range(10)] for r in range(10)] 
Grid_height = len(Grid) 
Grid_width = len(Grid[0]) 

Neighbors = [ 
     grid_offset(dr, dc) 
      for dr in range(-1, 2) 
      for dc in range(-1, 2) 
      if not dr == dc == 0 
    ] 

def count_neighbors(row, col): 
    count = 0 
    for nb in Neighbors: 
     r = row + nb.dr 
     c = col + nb.dc 
     if 0 <= r < Grid_height and 0 <= c < Grid_width: 
      # Add the value, or just add one? 
      count += Grid[r][c] 

    return count 


Grid[4][6] = 1 
Grid[5][4] = 1 
Grid[5][5] = 1 

for row in range(10): 
    for col in range(10): 
     print(count_neighbors(row, col), "", end='') 

    print() 

打印:

$ python test.py 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 1 1 0 0 
0 0 0 1 2 3 1 1 0 0 
0 0 0 1 1 2 2 1 0 0 
0 0 0 1 2 2 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
+0

Sry,但我是相當初學者,我不知道如何使用'集合'。你能解釋一下你如何使用它以及grid_offset有什麼作用? –

+0

'grid_offset'是一個['collections.namedtuple'](https://docs.python.org/3/library/collections.html#collections.namedtuple)。一個命名的元組是一個簡單的元組類型,它具有命名字段,而不是t [0],t [1]。這使得閱讀代碼變得更容易。 'Neighbors'是'grid_offset'元組的集合,例如(-1,0)或(0,1),它定義了一個單元的八個可能的鄰居。 –

+0

謝謝,我不想添加任何東西到網格中,只要根據它將值更改爲1或0 –