2010-06-13 3 views
28

У меня есть список массивов, и я хотел бы получить декартово произведение элементов в массивах.Как применить 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.

Любые идеи?

Заранее спасибо.

+0

У вас уже есть ответы на приведенные ниже, но это имеет некоторые хорошие примеры использования для функции itertools продукта: https://www.hackerrank.com/challenges/itertools-product – Afflatus

ответ

36
>>> 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 только один аргумент. Просить декартово произведение одного списка является тривиальным случаем и возвращает список, содержащий только один элемент (список, заданный как аргумент).

35
>>> 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)] 
+7

делает наличие префикса Астерикс массив есть специальное значение в python или это просто что-то специфическое для itertools.product? – Ominus

+3

См. Http://stackoverflow.com/q/5239856/395857 и [Распаковка списков аргументов] (https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists). –

Смежные вопросы