遍历列表时跳过了一些值
Some values skipped when iterating through a list
我正在使用 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
中的每个项目。为什么会这样,我该如何纠正?
问题可能是您在遍历列表时更改了列表。因此,我不会创建此列表并在之后删除非法条目,而是直接创建一个仅包含允许条目的列表。
为此,您可以在列表理解中使用 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]
我正在使用 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
中的每个项目。为什么会这样,我该如何纠正?
问题可能是您在遍历列表时更改了列表。因此,我不会创建此列表并在之后删除非法条目,而是直接创建一个仅包含允许条目的列表。
为此,您可以在列表理解中使用 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]