2010-06-13 4 views
28

J'ai une liste de tableaux et je voudrais obtenir le produit cartésien des éléments dans les tableaux.Comment appliquer itertools.product aux éléments d'une liste de listes?

Je vais utiliser un exemple pour le rendre 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

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

Je reçois

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

Mais ce que je veux est

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

J'ai essayé quelques choses différentes:

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

Ils ont tous m'a donné cp0 au lieu de CP1.

Des idées?

Merci d'avance.

+0

Vous avez déjà les réponses ci-dessous, mais cela a quelques bons cas d'utilisation de la fonction du produit itertools: https://www.hackerrank.com/challenges/itertools-product – Afflatus

Répondre

36
>>> 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 tous les couples comme arguments séparés pour product, qui vous donnera le produit cartésien d'entre eux.

La raison pour laquelle votre version ne fonctionne pas, c'est que vous donnez product 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).

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

le fait d'avoir un préfixe asterix un tableau ont signification particulière en python ou est-ce juste quelque chose de spécifique à itertools.product? – Ominus

+3

Voir http://stackoverflow.com/q/5239856/395857 et [Unpacking Argument Lists] (https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists). –

Questions connexes