簡體   English   中英

迭代列表時會跳過某些值

[英]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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM