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