2

我需要用作用于列表每个位置的函数“counterPosition”的相应输出值替换列表阵营的所有元素

camp = [[True, False, False, False, False, True],
         [False, False, False, False, False, True],
         [True, True, False, True, False, True],
         [True, False, False, False, False, False],
         [False, False, True, False, False, False],
         [False, False, False, False, False, False]]


def counterPosition(x, y):
    bombs = 0
    for i in range(x-1, x+2):
        for j in range(y-1, y+2):
            if i<0 or j<0: continue
            elif camp[i][j] == True:
                bombs += 1
    return bombs

for x in range (len(camp)):
   for y in range (len(camp[x])):
       camp[x][y] = counterPosition(x,y)
print camp

这使:

IndexError: list index out of range
4

2 回答 2

2

问题出在你的counterPosition功能上。尤其是:

for i in range(x-1, x+2):
    for j in range(y-1, y+2):
        …
        elif camp[i][j] == True:

您正在传递x范围从0到的值len(camp)-1。这意味着i范围从-1len(camp)-1+2。因此,例如,当您到达最后一行时,x=5,的i范围将从-16。但是camp[6]已经越界了。所以你得到一个IndexError.

当然,你会遇到同样的问题yand j

那么,你如何解决这个问题?嗯,这取决于你想做什么。但是,鉴于这一行:

if i<0 or j<0: continue

我想你想要的是添加这个:

elif i>=len(camp) or j>=len(camp[i]): continue

虽然确实如此,但在循环之外消除这些会更简单——例如,for i in range(max(x-1, 0), min(x+2, len(camp)):


同时,我不确定你的程序想要做什么,但它看起来像是某种与扫雷有关的东西,是吗?如果是这样,我认为即使您解决了这个问题,它也不会做您想做的事情。当您用计数替换Trueand值时,对于. 所以,最终的结果是:Falsecamp[i][j] == Truei<=x and j<=y

[[2, 2, 2, 1, 3, 2],
 [2, 2, 3, 2, 4, 2],
 [3, 2, 1, 2, 1, 2],
 [1, 3, 2, 3, 1, 2],
 [1, 3, 1, 2, 1, 2],
 [1, 3, 1, 3, 1, 2]]

当我认为你可能想要这个时:

[[1, 1, 0, 0, 2, 2],
 [3, 3, 2, 1, 4, 3],
 [3, 3, 2, 1, 3, 2],
 [3, 4, 3, 2, 2, 1],
 [1, 2, 1, 1, 0, 0],
 [0, 1, 1, 1, 0, 0]]

这是在偶数给定方格上相邻炸弹的数量。要获得后者,要么迭代或修改 的副本camp,而不是对相同的list. 例如:

newcamp = copy.deepcopy(camp)
for x in range (len(camp)):
   for y in range (len(camp[x])):
       newcamp[x][y] = counterPosition(x,y)
print newcamp

要不就:

camp = [[counterPosition(x, y) for y in range(len(camp[x]))] 
        for x in range(len(camp))]
print camp

(虽然真的,我会给他们不同的名字,比如bombcampflagcamp或什么的……)

于 2013-02-27T23:58:50.500 回答
0

存储此数据的另一种方法是使用集合:

bombs = {
    (i, j) for i, row in enumerate(camp)
           for j, is_bomb in enumerate(row)
           if is_bomb
}

然后,而不是camp[i][j] == True,做(i, j) in bombs

于 2013-02-28T00:15:21.070 回答