gvrocha - 1 year ago 87

Python Question

I have a list of arrays and I would like to get the cartesian product of the elements in the arrays.

I will use an example to make this more concrete...

itertools.product seems to do the trick but I am stuck in a little detail.

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

If I do

`cp = list(itertools.product(arrays));`

I get

`cp = cp0 = [((-1, 1),), ((-2, 2),), ((-3, 3),)]`

But what I want to get is

`cp1 = [(-1,-2,-3), (-1,-2,+3), (-1,+2,-3), (-1,+2,+3), ..., (+1,+2,-3), (+1,+2,+3)].`

I have tried a few different things:

`cp = list(itertools.product(itertools.islice(arrays, len(arrays))));`

cp = list(itertools.product(iter(arrays, len(arrays))));

They all gave me

Any ideas?

Thanks in advance.

Answer Source

```
>>> 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)]
```

This will feed all the pairs as separate arguments to `product`

, which will then give you the cartesian product of them.

The reason your version isn't working is that you are giving `product`

only one argument. Asking for a cartesian product of one list is a trivial case, and returns a list containing only one element (the list given as argument).