如何将itertools.product应用于列表列表的元素?

时间:2010-06-13 21:34:53

标签: python itertools cartesian-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

有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:42)

>>> 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一个参数。要求一个列表的笛卡尔积是一个简单的情况,并返回一个只包含一个元素的列表(作为参数给出的列表)。

答案 1 :(得分: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)]

答案 2 :(得分:0)

您可以使用itertools.product在三个档次中完成

lst=[]
arrays = [(-1,+1), (-2,+2), (-3,+3)]  

import itertools 

for i in itertools.product(*arrays):
         lst.append(i)



print(lst)

enter image description here