双重迭代到列表python 3

时间:2017-11-16 10:22:32

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

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

2 个答案:

答案 0 :(得分:4)

要将带有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]

由于您使用[img[x, y][:3] for x in range(img_row) for y in range(img_col)] 中的前3个值构建新列表,因此您还可以使用切片:

for

你在尝试中犯了三个错误;你交换了y循环的顺序,你添加了一个额外的,迷路],你删除了每次迭代产生的列表对象的 var colonneB = selectedRange.Rows.Cast<Excel.Range>().Select(x => x.Value2.ToString()).ToList(); 结束括号。

答案 1 :(得分:1)

我不完全确定你想要实现什么,但如果我的假设是正确的(你想从你用opencv打开的图像的三个通道中获得像素值列表),你可以使用numpy来做到这一点。

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

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

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