/ / Come applicare itertools.product agli elementi di un elenco di liste? - pitone, itertools, prodotto cartesiano

Come applicare itertools.product a elementi di un elenco di liste? - pitone, itertools, prodotto cartesiano

Ho una lista di array e vorrei ottenere il prodotto cartesiano degli elementi negli array.

Userò un esempio per renderlo più concreto ...

itertools.product sembra fare il trucco, ma io sono bloccato in un piccolo dettaglio.

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

Se lo faccio

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

ottengo

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

Ma quello che voglio ottenere è

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

Ho provato alcune cose diverse:

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

Mi hanno dato tutti CP0 invece di cp1.

Qualche idea?

Grazie in anticipo.

risposte:

38 per risposta № 1
>>> 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)]

Questo alimenterà tutte le coppie come argomenti separati product, che ti darà quindi il prodotto cartesiano di loro.

La ragione per cui la tua versione non funziona è quella che stai dando product solo un argomento. Chiedere un prodotto cartesiano di una lista è un caso banale e restituisce una lista contenente solo un elemento (la lista data come argomento).


35 per risposta № 2
>>> 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)]