【问题标题】:Double iteration to a list python 3双重迭代到列表python 3
【发布时间】:2018-04-29 20:11:39
【问题描述】:
for x in range(0,img_row):
    for y in range(0,img_col):
       img_lst.append([img[x,y][0],img[x,y][1],img[x,y][2]])
return img_lst

如何在这里使用列表理解?

img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)]

我试过了,但它给出了我的无效语法,当我在开头删除“y”时,它给我 Y 未定义

整个函数:

def cvimg_to_list(img):
    img_row = img.shape[0]
    img_col = img.shape[1]
    img_lst=[]

    img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)]
    return img_lst

【问题讨论】:

  • ...img[x,y][2] y... 这似乎是错误的

标签: python python-3.x list iteration list-comprehension


【解决方案1】:

我不完全确定您要实现什么,但如果我的假设是正确的(您想从使用 opencv 打开的图像的三个通道中获取像素值列表),您可以使用 numpy 来执行此操作。

img_lst=img.reshape(-1,3).tolist()

请记住,cv2 将图像加载为 BGR 而不是 RGB。

注意:这不是问题的正确答案,我宁愿将此作为评论发布,但我没有足够的声誉

【讨论】:

  • 请考虑对 general purposes 设置了 cmets 的限制,即使您的意思很好,也可以使用可能不受欢迎的答案来规避。在这种情况下,如果 OP 只是在寻找将图像简化为列表的任何方法,那么您的帖子有一个优点作为答案,但如果他们有兴趣明确编写理解列表,那么...
【解决方案2】:

要将带有list.append() 调用的嵌套循环转换为列表解析,您只需将.append(...) 括号之间的所有内容移到前面,删除for 循环之后的: 冒号,然后最后在结果周围添加[...]

[
[img[x,y][0],img[x,y][1],img[x,y][2]]
for x in range(0,img_row)
    for y in range(0,img_col)
]

注意for 循环的顺序不会改变

然后可以将其放在一行上;为了便于阅读,我添加了一些空格并简化了 range() 调用:

[[img[x, y][0], img[x, y][1], img[x, y][2]]
 for x in range(img_row) for y in range(img_col)]

因为您使用来自img[x, y] 的前 3 个值构建了一个新列表,所以您也可以使用切片:

[img[x, y][:3] for x in range(img_row) for y in range(img_col)]

你在尝试中犯了三个错误;您交换了 for 循环的顺序,添加了一个额外的流浪 y,并为每次迭代生成的列表对象删除了 ] 右括号。​​

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2010-11-14
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多