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

2024-05-28 23:38:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的是有一个二维数组,对于数组中的每个坐标,询问它周围的所有其他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循环改为:

^{pr2}$

得到了这个错误:

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

似乎我不能在网格坐标上加上,但我可以减去。为什么?在


Tags: inforif错误range数组gridappend
3条回答

python中的有效索引是-len(grid)到{}。正指数从前面访问元素,负指数从后面偏移。如果索引大于len(grid)-1,则加法会产生一个范围错误,这就是您所看到的。除非得到小于-len(grid)的索引值,否则减法不会产生范围错误。虽然您没有检查下限,即0(零),但它似乎对您有效,因为小的负指数从后端返回值。这是一个无声的错误,会导致错误的邻域结果。在

错误正是它所说的,您需要检查坐标是否适合网格:

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

否则,您试图访问内存中不存在的元素,或者不是您实际考虑的元素-Python处理负索引,它们从末尾开始计数。在

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

如果要计算偏移量,则需要确保偏移量在列表的范围内。所以如果你有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()

印刷品:

^{pr2}$

相关问题 更多 >

    热门问题