Python 列表错误

标签 python list

我需要用作用于列表每个位置的函数“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 的值范围从 0len(camp)-1 。这意味着 i范围从 -1len(camp)-1+2 。因此,例如,当您到达最后一行时, x=5 , i范围为 -16 。但是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

(虽然说实话,我会给它们起不同的名字,比如 bombcampflagcamp 或者其他什么......)

关于Python 列表错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124899/

相关文章:

python - 使用多索引合并两个数据帧

R:将列表数据转换为数据框

python - Pycharm:cfg和.pylintrc文件的文件类型是什么(用于语法突出显示)

python - 在 python 中浏览网站、抓取和发布

Python,如何根据列表重命名多个文件?

python - 获取数字元素最大的元组,如果出现平局,则随机选择平局元组之一

python - 在 python 中将列表打印到表上

c++ - C++ 中 & 的 C 替换

python - 我应该如何阅读堆积的电子表格?

python - 如何从Python连接/查询始终加密的Azure SQL?