如何将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。
有什么想法吗?
提前谢谢你。
3 个回答
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
一个参数。要计算一个列表的笛卡尔积是个简单的情况,它只会返回一个包含单个元素的列表(就是你传进去的那个列表)。