将循环转换为列表理解

时间:2017-06-22 16:16:50

标签: python list loops list-comprehension

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

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

# 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

请帮忙吗?为什么列表理解不能计算与循环相同的东西???

1 个答案:

答案 0 :(得分:2)

嵌套的应该在父元素之后:

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()