У меня проблема с "выравниванием" некоторых генераторов в python.Вот мой код:
import itertools as it
test = [[1,2,3],[4,5],[6,7,8]]
def comb(possible):
if len(possible) != 1:
for a in possible[0]:
yield from it.product((a,), comb(possible[1:]))
else:
yield from possible[0]
list(comb(test))
, который дает мне:
[(1, (4, 6)),
(1, (4, 7)),
(1, (4, 8)),
(1, (5, 6)),
(1, (5, 7)),
(1, (5, 8)),
(2, (4, 6)),
(2, (4, 7)),
(2, (4, 8)),
(2, (5, 6)),
(2, (5, 7)),
(2, (5, 8)),
(3, (4, 6)),
(3, (4, 7)),
(3, (4, 8)),
(3, (5, 6)),
(3, (5, 7)),
(3, (5, 8))]
Однако я хочу что-то вроде:
[(1, 4, 6),
(1, 4, 7),
(1, 4, 8),
(1, 5, 6),
(1, 5, 7),
(1, 5, 8),
(2, 4, 6),
(2, 4, 7),
(2, 4, 8),
(2, 5, 6),
(2, 5, 7),
(2, 5, 8),
(3, 4, 6),
(3, 4, 7),
(3, 4, 8),
(3, 5, 6),
(3, 5, 7),
(3, 5, 8)]
В общем, функция должна дать мнегенераторы для всех возможных путей прохождения списка, т.е. from test[0] -> test[1] -> ... -> test[n]
, где n
равно len(test)
.Здесь на каждом шаге он получает один элемент.
Аналогично тому, что возвращает следующая функция, только с генераторами:
def prod(possible):
if len(possible) != 1:
b = []
for i in range(len(possible[0])):
for x in prod(possible[1:]):
if len(possible) == 2:
b += [[possible[0][i]]+[x]]
else:
b += [[possible[0][i]]+x]
return b
else:
return possible[0]
prod(test)
Я играл с it.chain
и it.chain.from_iterable
, ноне могу заставить его работать.Проблема в том, что мой «тестовый» список имеет переменный размер и длину, и поэтому мне приходится делать все это рекурсивно.
Редактировать:
itertools.product(*test)
работы, как указано Джоном Коулманом