Я пытаюсь найти общий способ генерации всех комбинаций нескольких диапазонов или списков, например,
[range(0, 2), range(2, 5), range(4, 6), range(2, 3)]
,
, который должен возвращать элемент 2x3x2x1 = 12list.
[[0, 2, 4, 2],
[0, 2, 5, 2],
[0, 3, 4, 2],
[0, 3, 5, 2],
[0, 4, 4, 2],
[0, 4, 5, 2],
[1, 2, 4, 2],
[1, 2, 5, 2],
[1, 3, 4, 2],
[1, 3, 5, 2],
[1, 4, 4, 2],
[1, 4, 5, 2]]
Пока все хорошо.Когда я жестко его кодирую, выполняя
x = [ ( [a,b] for a in rgs[0] for b in rgs[1] ) ]
x.append( ( a + [b] for a in x[-1] for b in rgs[2]) )
x.append( ( a + [b] for a in x[-1] for b in rgs[3]) )
, я получаю хороший результат.Однако, когда я пытаюсь обобщить это, выполняя
x = [ ( [a,b] for a in rgs[0] for b in rgs[1] ) ]
for i in range(1,len(rgs)-1):
x.append( ( a + [b] for a in x[-1] for b in rgs[i+1]) )
, я получаю список из 6 элементов:
[[0, 2, 2, 2],
[0, 3, 2, 2],
[0, 4, 2, 2],
[1, 2, 2, 2],
[1, 3, 2, 2],
[1, 4, 2, 2]]
Кроме того, я замечаю, что все диапазоны, генерируемые послепервые два используют диапазон в rgs[-1]
вместо правильных.Я изо всех сил пытаюсь понять, почему это происходит, поскольку я полагаю, что эти два примера кода идентичны, за исключением того, что последний является более общей формой для произвольного большого числа диапазонов.