我该如何简化此列表?

时间:2014-02-20 23:07:20

标签: python list slice

列表切片从来都不是我在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 个答案:

答案 0 :(得分: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]

会将n的索引l中的每三个项目移至最后;与range一样,切片的参数与[start:stop:step]一样。