在网格中查找相邻单元格而不例外

时间:2017-01-26 16:58:52

标签: python arrays python-2.7 exception multidimensional-array

有时我在2D数组中有一个区域,我需要检查相邻的单元格。通常我会做以下事情:

adjacentCells = (world[y+1][x]==1)+(world[y-1]==1)+(world[y][x+1]==1)+(world[y][x-1]==1)

这将计算到点(x,y)的正交相邻单元的数量等于1.问题是,如果我的x或y坐标为0(顶部或左边缘),这样做就会包裹矩阵),如果点(x,y)位于不同的边缘,它会导致异常。这使代码看起来像这样:

def adjacentCells(x,y):
    total=0
    if x==0:
        total += 1
    else:
        total += world[y][x-1]
    if y==0:
        total += 1
    else:
        total += world[y-1][x]
    try:
        total += world[y][x+1]
    except:
        total += 1
    try:
        total += world[y+1][x]
    except:
        total += 1
    return total

有没有办法解决这个问题,其方式与最上面的例子一样简单?

2 个答案:

答案 0 :(得分:1)

我会这样做:

$set

因此,请获取潜在邻居的列表,但在使用之前检查每个邻居是否有效。

如果边界单元的邻居计为0而不是1则更简单,那么在使用之前你只需要过滤邻居列表。

答案 1 :(得分:1)

为了做一些微不足道的事情,比如将最多4个单元格的值相加,我只需为每个单元格编写代码 - 每个单元格位置只需要一行。它可能比使用循环结构更长,但避免了循环开销,它几乎都是样板。

它也相对容易阅读和理解,并且会使特殊情况变得更容易,其中一个地点应该出于某种原因需要这样做。

这就是我的意思:

world = [[1, 1, 1, 1],
         [1, 1, 1, 1],
         [1, 1, 1, 1]]

MIN_X, MAX_X = 0, len(world[0])-1
MIN_Y, MAX_Y = 0, len(world)-1

def adjacentCells(x, y):
    return((world[  y][x-1] if MIN_Y <=   y <= MAX_Y and MIN_X <= x-1 <= MAX_X else 1)
         + (world[  y][x+1] if MIN_Y <=   y <= MAX_Y and MIN_X <= x+1 <= MAX_X else 1)
         + (world[y-1][  x] if MIN_Y <= y-1 <= MAX_Y and MIN_X <=   x <= MAX_X else 1)
         + (world[y+1][  x] if MIN_Y <= y+1 <= MAX_Y and MIN_X <=   x <= MAX_X else 1))

print(adjacentCells(0, 0))  # -> 4
print(adjacentCells(1, 1))  # -> 4
相关问题