【问题标题】:nested list generator with iterative variable具有迭代变量的嵌套列表生成器
【发布时间】:2020-07-11 13:32:00
【问题描述】:

我有一组变量要插入到嵌套列表中

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']]

【问题讨论】:

  • 如果不是字符串,您希望这些值是什么?
  • 从名称上看,OP 似乎希望它们是文件路径或其他东西;
  • 嗨!欢迎来到 SO!如果您有任何新信息,请更新您的问题,以便更容易理解。

标签: python list generator nested-lists


【解决方案1】:

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

简答

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

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

查看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

【讨论】:

    【解决方案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']
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 2013-05-11
      • 1970-01-01
      • 2020-06-06
      • 2014-07-31
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      相关资源
      最近更新 更多