Как применить itertools.product к элементам списка списков?
У меня есть список массивов, и я хотел бы получить декартово произведение элементов в массивах.
Я буду использовать пример, чтобы сделать это более конкретным...
itertools.product, похоже, делает трюк, но я застрял в небольшой детали.
arrays = [(-1,+1), (-2,+2), (-3,+3)];
Если я делаю
cp = list(itertools.product(arrays));
Я получаю
cp = cp0 = [((-1, 1),), ((-2, 2),), ((-3, 3),)]
Но я хочу получить
cp1 = [(-1,-2,-3), (-1,-2,+3), (-1,+2,-3), (-1,+2,+3), ..., (+1,+2,-3), (+1,+2,+3)].
Я пробовал несколько разных вещей:
cp = list(itertools.product(itertools.islice(arrays, len(arrays))));
cp = list(itertools.product(iter(arrays, len(arrays))));
Все они дали мне cp0 вместо cp1.
Любые идеи?
Спасибо заранее.
Ответы
Ответ 1
>>> list(itertools.product(*arrays))
[(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]
Это будет передавать все пары в виде отдельных аргументов в product
, что даст вам декартово произведение.
Причина, по которой ваша версия не работает, заключается в том, что вы даете product
только один аргумент. Просить декартово произведение одного списка является тривиальным случаем и возвращает список, содержащий только один элемент (список, указанный как аргумент).
Ответ 2
>>> arrays = [(-1,+1), (-2,+2), (-3,+3)]
>>> list(itertools.product(*arrays))
[(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]