【问题标题】:Some values skipped when iterating through a list遍历列表时跳过了一些值
【发布时间】:2016-01-10 02:31:44
【问题描述】:

我正在使用 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 中的每个项目。为什么会这样,我该如何纠正?

【问题讨论】:

  • 如果试图在下面回答您的问题,但现在我在您的代码中发现了一个错字,这可能是另一个错误原因。在您的列表理解中,您同时使用x+...,而它可能应该是(x+x2,y+y2)

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


【解决方案1】:

问题可能是,您在迭代列表时更改了列表。因此,我不会创建此列表并随后删除非法条目,而是直接创建一个仅包含允许条目的列表。
为此,您可以在列表理解中使用 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]

【讨论】:

  • 非常感谢。当您第一次回答时,它不起作用,但是您的解决方案与我错过的那个错字相结合,效果很好。谢谢:)
  • 一开始我复制了错字,然后我尝试了其他值并注意到错误。 :) 我很高兴能帮上忙。
  • 是的,我就是这么想的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多