如何在python中添加网格坐标?

如何在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):

我要做的是建立一个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):
        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