带迭代变量的嵌套列表生成器

2024-09-27 23:19:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在嵌套列表中插入一组变量

im1 = cv2.imread('0_0.jpg') 
im2 = cv2.imread('0_1080.jpg') 
im3 = cv2.imread('960_0.jpg') 
im4 = cv2.imread('960_1080.jpg') 
im5 = cv2.imread('1920_0.jpg') 
im6 = cv2.imread('1920_1080.jpg') 
im7 = cv2.imread('2880_0.jpg') 
im8 = cv2.imread('2880_1080.jpg')

我想创建一个自定义大小的嵌套列表,其中包含具有迭代命名的变量

[[im1, im2],[im3, im4], [im5, im6], [im7, im8]]

我已经尝试创建一个简单的列表生成器,如下所示

n = 4
m = 2
a = [['im{0}'.format(i)] * m for i in range(n)]

但是结果仍然不像我预期的那样,并且变量是字符串

[['im0', 'im0'], ['im1', 'im1'], ['im2', 'im2'], ['im3', 'im3']]

Tags: 列表cv2命名jpgim0imimreadim1
2条回答

我认为Tgilgul的答案是正确的,但是,我也想添加这个解决方案,因为在我看来,基本问题并不是关于变量的

此外,如果要从目录中读取更多图像,此解决方案更具动态性

# List of images
# Can be retrieved by other function
images = ['0_0.jpg','0_1080.jpg','960_0.jpg','960_1080.jpg','1920_0.jpg','1920_1080.jpg','2880_0.jpg','2880_1080.jpg']

# key for each pair
keys = list(set([image.split("_")[0] for image in images]))

成对列表

pairs = []
for k in keys:
    pair = []
    for image in images:
        if image.split("_")[0] == k:
            # pair.append(image) # the filename
            pair.append(cv2.imread(image)) # the image - not tested

    pairs.append(pair)

print(pairs)

文件名输出

[['960_0.jpg', '960_1080.jpg'], ['1920_0.jpg', '1920_1080.jpg'], ['2880_0.jpg', '2880_1080.jpg'], ['0_0.jpg', '0_1080.jpg']]

成对词典

pairs = {}
for k in keys:
    pair = []
    for image in images:
        if image.split("_")[0] == k:
            # pair.append(image) # the filename
            pair.append(cv2.imread(image)) # the image - not tested

    pairs[k] = pair

print(pairs)

文件名输出

{
'960': ['960_0.jpg', '960_1080.jpg'], 
'1920': ['1920_0.jpg', '1920_1080.jpg'], 
'2880': ['2880_0.jpg', '2880_1080.jpg'], 
'0': ['0_0.jpg', '0_1080.jpg']
}

使用上述两种解决方案,图像可以在其他功能需要的地方读取

我真的希望我做对了,但我相信您需要一个对列表,并且值应该是从cv2.imread()的相关调用返回的类

简短回答

使用eval(),它接受字符串输入并将其转换为它们表示的python值。例如:

>>> eval("10+10")
20

见a nice tutorial on eval here

更多详细信息

检查您的请求时,我发现代码中存在另一个问题: 您需要此输出:

[[im1, im2],[im3, im4], [im5, im6], [im7, im8]] 

但是您的循环为您提供了具有相同索引的对,而不是(x,x+1):

[['im0', 'im0'], ['im1', 'im1'], ['im2', 'im2'], ['im3', 'im3']]

我创建了一个示例文件,该文件回答了您提供的示例值,对代码的更改非常小:

class Img(object):
    """ I'm an image from imread """

    def __init__(self, var_name):
        self.var_name = var_name

    def __str__(self):
        return "I'm of class Img and my var name is {var}".format(var=self.var_name)

if __name__ == "__main__":
    im1 = Img("im1")
    im2 = Img("im2")
    im3 = Img("im3")
    im4 = Img("im4")
    im5 = Img("im5")
    im6 = Img("im6")
    im7 = Img("im7")
    im8 = Img("im8")

    n = 4
    m = 2
    a = [[eval('im{0}'.format(2*i+1)),eval('im{0}'.format(2*i+2))] for i in range(n)]

    for pair in a:
        print "We are a pair:"
        for obj in pair:
            print obj

由于我没有这些图像,它只是证明了这些对构造良好,属于Img类型:

$python ./example.py
We are a pair:
I'm of class Img and my var name is im1
I'm of class Img and my var name is im2
We are a pair:
I'm of class Img and my var name is im3
I'm of class Img and my var name is im4
We are a pair:
I'm of class Img and my var name is im5
I'm of class Img and my var name is im6
We are a pair:
I'm of class Img and my var name is im7
I'm of class Img and my var name is im8

相关问题 更多 >

    热门问题