2014-02-20 56 views
0

列表切片在Python中從來不是我最強烈的方面,而且我有點不知所措。如何簡化此列表?

for x in range(1, width-1): 
    for y in range(1, height-1): 
    temp, walls = [], 0 
    temp = [[ grid[x-1][y-1], grid[x][y-1], grid[x+1][y-1] ], 
      [ grid[x-1][y], '@', grid[x+1][y] ], 
      [ grid[x-1][y+1], grid[x][y+1], grid[x+1][y+1] ]] 
for l in temp: walls += l.count('#') 

這是我的代碼元胞自動機地圖生成一個簡單的roguelike的一部分。不知何故,這種冗長的醜陋言論可以被簡化。我認爲temp = [ grid[x-1::3][y-1], grid[x-1::3][y], grid[x-1::3][y+1] ]會工作,但我得到索引超出範圍的錯誤。

+1

您使用了3的步長。也許您的意思是'x-1:x + 2:1'? (開始,停止,步驟)。但是我對你在2D環境中的切片感到困惑。你可能想在翻譯中玩弄一下,看看是否有可能。 – keyser

回答

4

如果我理解正確的,我想你想:

temp = [l[y-1:y+2] for l in grid[x-1:x+2]] # extract local data 
temp[1][1] = "@" # replace centre 
walls = sum(l.count("#") for l in temp) # count walls 

切片你要使用:

l[n::3] 

將採取一切第三個項目從l到年底指數n;切片的參數與range[start:stop:step]一樣。

+0

我完全忘了python是如何工作的;我明白爲什麼它現在不工作。謝謝! – Bocochoco