J'ai une liste de tableaux et je voudrais obtenir le produit cartésien des éléments dans les tableaux.
Je vais utiliser un exemple pour rendre cela plus concret ...
itertools.product semble faire l'affaire mais je suis coincé dans un petit détail.
arrays = [(-1,+1), (-2,+2), (-3,+3)];
Si je fais
cp = list(itertools.product(arrays));
Je reçois
cp = cp0 = [((-1, 1),), ((-2, 2),), ((-3, 3),)]
Mais ce que je veux, c'est
cp1 = [(-1,-2,-3), (-1,-2,+3), (-1,+2,-3), (-1,+2,+3), ..., (+1,+2,-3), (+1,+2,+3)].
J'ai essayé différentes choses:
cp = list(itertools.product(itertools.islice(arrays, len(arrays))));
cp = list(itertools.product(iter(arrays, len(arrays))));
Ils m'ont tous donné cp au lieu de cp1.
Des idées?
Merci d'avance.
>>> 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)]
Cela alimentera toutes les paires en arguments séparés vers product
, qui vous en donnera alors le produit cartésien.
La raison pour laquelle votre version ne fonctionne pas est que vous ne donnez à product
qu'un seul argument. Demander un produit cartésien d'une liste est un cas trivial, et renvoie une liste contenant un seul élément (la liste donnée en argument).
>>> 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)]