Cómo aplicar itertools.producto a elementos de una lista de listas?


Tengo una lista de arrays y me gustaría obtener el producto cartesiano de los elementos en los arrays.

Usaré un ejemplo para hacer esto más concreto...

Itertools.producto parece hacer el truco, pero estoy atascado en un pequeño detalle.

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

Si lo hago

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

Consigo

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

Pero lo que quiero conseguir es

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

He intentado algunas cosas diferentes:

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

Todos me dieron cp0 en lugar de cp1 .

¿Alguna idea?

Gracias de antemano.

Author: martineau, 2010-06-14

2 answers

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

Esto alimentará todos los pares como argumentos separados a product, que luego le dará el producto cartesiano de ellos.

La razón por la que tu versión no funciona es porque estás dando product solo un argumento. Pedir un producto cartesiano de una lista es un caso trivial, y devuelve una lista que contiene solo un elemento (la lista dada como argumento).

 39
Author: interjay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-13 21:44:57
>>> 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)]
 35
Author: rkhayrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-13 21:41:14