2010-06-13 25 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

您已經有了下面的答案,但是這對於迭代工具產品功能比較好的使用案例:https://www.hackerrank.com/challenges/itertools-product – Afflatus 2016-09-16 19:31:06

回答

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 2014-04-02 20:12:53

+3

請參閱http://stackoverflow.com/q/5239856/395857和[解包參數列表](https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists)。 – 2014-04-13 22:07:07

相關問題