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

56 投票
3 回答
65378 浏览
提问于 2025-04-15 23:55

我有一个数组的列表,我想要得到这些数组中元素的笛卡尔积。

我用一个例子来让这个问题更清楚...

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 个回答

1

你可以用三步走的方法来实现这个,使用 itertools.product。

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

import itertools 

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



print(lst)

在这里输入图片描述

40

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续进行。比如说,你可能希望程序在用户输入正确的密码后才能访问某个功能。

此外,程序还可以根据不同的情况做出不同的反应。比如,如果用户输入的密码错误,程序可以提示用户“密码错误,请重试”。这样,用户就知道自己哪里做错了。

总之,编程中的条件判断就像是在给程序设定一条条规则,让它根据不同的情况做出相应的反应。

>>> 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)]
76
>>> 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 一个参数。要计算一个列表的笛卡尔积是个简单的情况,它只会返回一个包含单个元素的列表(就是你传进去的那个列表)。

撰写回答