2014-10-18 42 views
0

我试图评估和修改嵌套for循环中嵌套列表的元素,但是当我尝试访问list [i-1] [j ]如何在python中正确访问嵌套列表中的元素

这工作:

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 (我希望是有道理的)

+2

“我的代码打破”是什么意思?你有例外吗?如果是这样,请将追溯复制并粘贴到您的问题中。如果您得到错误的结果,请显示预期结果和实际结果。如果发生其他事情,请描述一下。 – abarnert 2014-10-18 00:32:49

+1

另外,你为什么在这里使用'i-1'?你想要它做什么?给我们一些精简的样本输入,告诉我们你期望发生什么。 – abarnert 2014-10-18 00:34:25

+0

没有例外,代码有效,但会产生意想不到的结果。所有元素都设置为'bar',就好像if语句被忽略 – pixel 2014-10-18 00:37:24

回答

0

你遇到的问题是因为你正在修改的值当你迭代它时你的嵌套列表。将空地的左上角变成#后,其左右两侧的开放空间现在也被视为左上角,当轮到他们时,变成# s谈到。当您修改左下角时不会发生这种情况,因为当您接触到它时,您已经处理了上方和左方的正方形。

要解决此问题,有几种不同的方法。最简单的可能是简单地反向迭代,从WIDTHLENGTH开始并倒计数到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将取代它们的值的平方。你可以检查任何角落:

def is_corner(lst, i, j): 
    return (0 < i < len(lst) and 0 < j < len(lst[0]) and 
      (lst[i-1][j] == "bar" or lst[i+1][j] == "bar") and 
      (lst[i][j-1] == "bar" or lst[i][j+1] == "bar")) 
+0

这样做很有意义,我只是在编写程序的简化版本,以更好地解释我正在尝试完成的任务,但您已经完成了它。非常感谢 – pixel 2014-10-18 02:01:45

相关问题