列表中出现Python错误

列表中出现Python错误,python,list,Python,List,我需要用respectives输出值替换列表camp的所有元素​​作用于列表中每个位置的函数“对位” camp = [[True, False, False, False, False, True], [False, False, False, False, False, True], [True, True, False, True, False, True], [True, False, False, False, False, Fals

我需要用respectives输出值替换列表camp的所有元素​​作用于列表中每个位置的函数“对位”

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

问题出在您的
对位功能中。特别是:

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
的范围从
-1
len(camp)-1+2
。因此,例如,当您到达最后一行时,
x=5
i
的范围从
-1
6
。但是
camp[6]
是不受限制的。因此您得到了一个
索引器

当然,
y
j
也会有同样的问题

那么,你如何解决这个问题呢?这取决于你想做什么。但是,考虑到这一点:

if i<0 or j<0: continue
虽然实际上,在循环之外消除这些会更简单,例如,对于范围内的i(max(x-1,0),min(x+2,len(camp)):



同时,我不确定你的程序想做什么,但它看起来像是某种扫雷舰相关的东西,是吗?如果是这样,我认为即使你解决了这个问题,它也不会做你想做的事情。当你用计数替换
True
False
值时,
camp[I][j]==True
对于
i而言永远不可能为True存储此数据的另一种方法是使用集合:

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)

什么是回溯?您尝试访问
camp[i][j]
i
可以是
x+1
j
可以是
y+1
时。如果你修改
camp
的话,这对你来说不太合适,你正在做的事情。@Eric:我不确定你的意思。这不会导致错误(你可以在迭代列表时改变列表的值,但不能改变列表本身的形状,例如通过插入或删除值)。它肯定会做一些事情(例如,第一行将以
[2,2,2,1,3,2]
结束).唯一的问题是这是否是OP想要的。非常感谢,正是这样!
elif i>=len(camp) or j>=len(camp[i]): continue
[[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]]
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
bombs = {
    (i, j) for i, row in enumerate(camp)
           for j, is_bomb in enumerate(row)
           if is_bomb
}