如何在python中添加网格坐标?
我要做的是建立一个2D数组,对于数组中的每个坐标,询问它周围的所有其他8个坐标是否存储了1或0。类似于寻找地雷的扫雷舰 我曾经有过这样的经历:如何在python中添加网格坐标?,python,arrays,Python,Arrays,我要做的是建立一个2D数组,对于数组中的每个坐标,询问它周围的所有其他8个坐标是否存储了1或0。类似于寻找地雷的扫雷舰 我曾经有过这样的经历: 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):
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 <= i < 10 and 0 <= j < 10
python中的有效索引是
-len(grid)
到len(grid)-1
。正指数指的是从前面偏移的元素,负指数指的是从后面偏移的元素。如果索引大于您看到的len(grid)-1
,则添加会产生范围错误。除非得到的索引值小于-len(网格)
,否则减法不会产生范围误差。虽然您没有检查下限,即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()
你检查边界了吗?e、 g.第一排没有上层邻居。您通常会有额外的
i>0
和i,如果您想创建这样的规则数组,您一定要切换到numpy
。在这里,您的第一个双循环将是一行:grid=numpy.zeros((10,10))
。也就是说,我并不真正遵循代码的逻辑。首先使用filea
和columna
作为循环索引,然后使用偏移量作为数组索引——我认为这不是您真正想要的。可以从filea
和columna
中减去1的原因是,在初始循环之后,它们都等于9
,“<代码> 9 + 1=10 < /代码>走出边界。OMG SRY我忘了在问题编辑中写一些东西,如果我只在数组的边框上有错误,那么我会做得更有意义,但是我在第一个for循环中所用的是,即使在中间,坐标也只看左边,上和左上角相邻坐标。它会将错误拖到其他任何地方吗?请发布显示错误的完整代码。Sry,但我是个初学者,不知道如何使用集合。您能解释一下您是如何在那里使用它的,以及网格偏移量的作用吗?grid\u offset
是一种。命名元组是具有命名字段的简单元组类型,而不是t[0],t[1]。这使得代码更容易阅读Neights
是一组grid\u offset
元组,如(-1,0)或(0,1),用于定义单元格的八个可能的邻居。谢谢,我不想在网格本身中添加任何内容,只需根据它将值更改为1或0即可
$ 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