генератор вложенных списков с итерационной переменной - PullRequest
1 голос
/ 31 марта 2020

У меня есть набор переменных, которые я хочу вставить во вложенный список

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

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Мне кажется, что ответ Тгильгула верен, однако я бы хотел добавить и это решение, так как мне кажется, что лежащие в основе вопросы на самом деле не касаются переменных.

Кроме того, это решение более динамично c, если вы хотите прочитать больше изображений из каталога.

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

С обоими вышеупомянутыми решениями изображения могут быть прочитаны там, где это необходимо в какой-то другой функции.

1 голос
/ 31 марта 2020

Я действительно надеюсь, что понял это правильно, но я верю, что вам нужен список пар, и значения должны быть классом, возвращаемым из соответствующего вызова cv2.imread ().

Краткий ответ

Используйте eval (), который принимает строковые входные данные и преобразует их в значение python, которое они представляют. Например:

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

См. хороший учебник по eval здесь .

Подробнее

Изучение вашего запроса I увидеть еще одну проблему в вашем коде: Вы хотели этот вывод:

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

Но ваш l oop дал вам пары с тем же индексом, а не (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...