我有一个数组列表,我想获得数组中元素的笛卡尔积。
我将用一个例子来说明这个更具体......
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 :(得分: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)