有时我在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
有没有办法解决这个问题,其方式与最上面的例子一样简单?
答案 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