web-dev-qa-db-fra.com

Comment appliquer itertools.product aux éléments d'une liste de listes?

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.

38
gvrocha
>>> 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).

44
interjay
>>> 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)]
36
rkhayrov