【问题标题】:Turning a loop into a list comprehension将循环变成列表理解
【发布时间】:2017-11-26 01:01:37
【问题描述】:

我正在编写这段代码,它获取图像的所有像素,然后将它们存储到一个列表中。

我的目标是将此循环转换为列表理解。

# Take the image
im = Image.open("C:/Users/admin/Desktop/IMG_170619_114715_0007_NIR.tif")
#load it
pixels = im.load() 
# take the width and the height
width, height = im.size

然后是循环...

all_pixels = []
for x in range(width):
    for y in range(height):
        cpixel = pixels[x,y]
        all_pixels.append(cpixel)

我的第一次尝试是这样......

all_pixels=[[pixels[x,y] for y in range(height)] for x in range(width)]

它正在工作,但是当我执行 len(all_pixels) 以查看我是否拥有所有像素时,我只有 1280 个值,这意味着在 lsit 理解中未正确完成计算...

len(all_pixels) Out[143]: 1280

我们应该有类似的东西..

len(all_pixels) Out[105]: 1228800

有什么帮助吗?为什么列表推导不计算与循环相同的东西???

【问题讨论】:

    标签: python list loops list-comprehension


    【解决方案1】:

    嵌套的 for 应该在父级之后:

    all_pixels = [pixels[x,y] for x in range(width) for y in range(height)]
    

    顺便说一句,您不需要索引,您可以简单地使用嵌套理解来展平您的图像:

    all_pixels = [x for row in pixels for x in row]
    

    图像是一个 numpy 数组,flatten 是实现结果的另一种方式。

    all_pixels = pixels.flatten().to_list()
    

    【讨论】:

    • @WillemVanOnsem 我不认为这有什么区别。
    • 顺便问一个问题,这会让我的代码(计算)更快吗?用列表理解替换循环?
    • @MouradOverFlow 是的,列表解析比普通的 for 循环更快。
    • @MosesKoledoye 当然,我该怎么办?我没有 15 声望,所以我无法为你的答案投票。
    • @MouradOverFlow 您不需要代表接受答案。见How does accepting an answer work?
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2022-01-12
    • 2020-03-29
    相关资源
    最近更新 更多