迭代列表

时间:2015-10-12 14:48:58

标签: python python-2.7 image-processing iterator python-imaging-library

我正在使用PIL编写一个Python程序,对于每个像素,需要找到该像素的5个像素内的所有像素的值。为了找到所有这些像素的位置,我编写了以下代码:

#w and h are dimensions of the image
for y in range(h):
    for x in range(w):
        #find neighboring pixels
        neighbors = [(x+x2,x+y2) for x2 in range(-5,5) for y2 in range(-5, 5)]
        for i, (x2, y2) in enumerate(neighbors):
            if x2 < 0 or y2 < 0:
                neighbors.pop(i)
            if x2 > w or y2 > h:
                neighbors.pop(i)

它理论上找到5个像素内的所有值,然后消除那些无效的值。但是,即使在第一个像素(0,0)上,并非所有底片都被消除,我之后会得到IndexError。似乎当我遍历neighbors时,它不会传递neighbors中的每个项目。为什么会这样,我该如何纠正呢?

1 个答案:

答案 0 :(得分:2)

问题可能是,您在迭代时更改列表。因此,我不会创建此列表并在之后删除非法条目,而是直接创建仅包含允许条目的列表 为此,您可以在列表理解中使用if语句:

[(x+x2,y+y2) for x2 in range(-5,5) for y2 in range(-5, 5) if x+x2>0 and x+x2<w and y+y2>0 and y+y2<h]

消除非法条目的另一个选择是使用另一个列表理解。然后,您可以使用与生成邻居相同的代码并删除非法条目,如下所示:

[(x,y) for (x,y) in neighbors if x>0 and y>0 and x<w and y<h]