我需要用作用于列表每个位置的函数“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
最佳答案
问题出在你的 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
范围从 -1
至len(camp)-1+2
。因此,例如,当您到达最后一行时, x=5
, i
范围为 -1
至6
。但是camp[6]
超出范围。所以你会得到一个IndexError
.
您也会遇到与 y
相同的问题和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)):
同时,我不确定你的程序想要做什么,但它看起来像是与扫雷相关的东西,是吗?如果是这样,我认为即使你解决了这个问题,它也不会达到你想要的效果。当您替换True
时和False
带计数的值,camp[i][j] == True
i<=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
(虽然说实话,我会给它们起不同的名字,比如 bombcamp
和 flagcamp
或者其他什么......)
关于Python 列表错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124899/