我如何添加到Python中的网格坐标中



我要做的是有一个2D数组,对于数组中的每个坐标,请询问周围所有其他8个坐标,如果他们存储了1或A。到寻找地雷的扫雷机。

我曾经有这个:

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循环的一半。所以我更改了第二个循环:

#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

看来我无法在网格坐标上添加,但我可以减去。为什么?

python中的有效索引为 -len(grid)len(grid)-1。正索引正在访问元素,而元素从前面偏移,而后方的元素是负面的。如果索引大于您所看到的len(grid)-1,则会给出范围错误。除非您获得小于-len(grid)的索引值,否则减去范围错误不会给您带来范围错误。尽管您不检查下边界,即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 <= i < 10 and 0 <= j < 10

否则,您正在尝试访问不存在内存中不存在的元素,或者您不是您实际想到的元素 - Python处理负索引,它们从末尾计数。

例如。a[-1]是最后一个元素,与a[len(a) - 1]

完全相同

最新更新