2014-10-18 44 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

相關問題