列表中出现Python错误
我需要用respectives输出值替换列表camp的所有元素作用于列表中每个位置的函数“对位”列表中出现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
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
}