Двойное сжатие списка Python с третьим несвязанным элементом

#python #list

Вопрос:

У меня есть понимание вложенного списка следующим образом:

 self.Item = [[Object(x, y) for y in range(3)] for x in range(3)]
 

Теперь мне нужно сделать то же самое, но у объекта есть третий параметр: Index (который является просто int 0-9, последовательно).

 self.Item = [[Object(x, y, index) for y in range(3)] for x in range(3)]
 

Решения, которые я нашел, использовали enumerated() , но мне было трудно реализовать их с помощью двух списков.

Комментарии:

1. Перечислять оба и умножать вместе?

2. Я устал от этого, но это дает странный шаблон вещей с тем же индексом из-за нулевого свойства продукта

3. Вы можете выбрать начальный номер до enumerate из.

Ответ №1:

Попробуйте это вместо:

 z=0 
L = []
for x in range(3):
    for y in range(3):
        L.append(Object(x,y,z))
        z =1
 

Лично для подобных случаев использования я склонен находить itertools очень полезным для использования вместо вложенных циклов for . Вы можете добавить больше элементов в свой itertools.product список, не беспокоясь о кошмарно вложенных циклах.

 import itertools

L=[]
z=0 

for X in itertools.product(range(3),range(3)):
    
    L.append(Object(X[0],X[1],z))
    z =1
        
 

Я просто не стал бы делать то, что у вас есть выше. Разделите свой код и сделайте его в 100 раз более читаемым и отлаживаемым в будущем. Подобный код кажется забавным и pythonic, но это ужасная идея.

Комментарии:

1. Да, это имеет смысл, спасибо! Трудно сопротивляться пониманию списка

Ответ №2:

Использование бесконечного итератора:

 from itertools import count
index = count()
self.Item = [[Object(x, y, next(index)) for y in range(3)] for x in range(3)]