如何在python中正确访问嵌套列表的元素

时间:2014-10-18 00:29:09

标签: python list loops for-loop nested

我正在尝试在python中嵌套for循环中评估和更改嵌套列表的元素,但是当我尝试访问列表时,我的代码会中断[i-1] [j]

这有效:

for i in range(HEIGHT):
    for j in range(WIDTH):

        if nested_list[i+1][j].foo == 'bar' and nested_list[i][j+1].foo == 'bar':
            nested_list[i][j].foo = 'bar'

但当我使用i-1或j-1代替上面的+1时,它会中断(插入条形作为所有元素的值)

for i in range(2, HEIGHT):
    for j in range(2, WIDTH):

       if nested_list[i-1][j].foo == 'bar' and nested_list[i][j-1].foo == 'bar':
           nested_list[i][j].foo = 'bar'

编辑:

嵌套列表包含如下地图:

##################
####.....#########
####.....#########
####.....#########
############....##
############....##
############....##
##################

当使用第一位代码时,会出现预期结果,矩形右侧的角变为#s

尝试这样做时,反过来'即评估左侧,整个阵列填充#s (我希望这是有道理的)

1 个答案:

答案 0 :(得分:0)

您遇到的问题是因为您在迭代它时修改嵌套列表的值。将开放空间的左上角转换为#后,其左侧(右侧和下侧)的开放空间现在也将自己视为左上角,因此变为{ {1}}轮到他们的时候。当您修改左下角时不会发生这种情况,因为当您到达它时,您已经处理了上方和左侧的方块。

要解决此问题,有几种不同的方法。最简单的可能是简单地反向迭代,从#WIDTH开始,倒计时到LENGTH。但是,这种方法同样脆弱(它只适用于左上角)。

另一种选择,如果你想要填充任何一种角落(不仅仅是左上角),它会更复杂但是可以工作,就是创建一个新的嵌套列表,而不是修改现有的列表。 。因为您一直在查看原始列表,所以在确定正方形的适当值时,您将永远不会看到先前操作的结果。

以下是一些使用列表推导来执行此操作的代码:

1

您可以根据需要修改def is_corner(lst, i, j): return i >= 0 and j > 0 and lst[i-1][j] == "bar" and lst[i][j-1] == "bar" new_nested_list = [["bar" if is_corner(nested_list, i, j) else nested_list[i][j] for j in range(WIDTH)] for i in range(HEIGHT)] 谓词函数,只有它返回is_corner的方块才会替换它们的值。您可以使用

检查任何角落
True