2010-04-02 26 views
2

Considérons un tuple v = (a,b,c) et une fonction de générateur generate(x) qui reçoit un article de l'uplet et génère plusieurs options pour chaque article.Fonctions de générateur imbriquées en python

Quelle est la manière pythonique de générer un ensemble de toutes les combinaisons possibles du résultat de generate(x) sur chaque élément du tuple?

que je pouvais faire ceci:

v = (a,b,c) 
for d in generate(v[0]): 
    for e in generate(v[1]): 
     for f in generate(v[2]): 
      print d,e,f 

mais c'est juste laid, plus je besoin d'une solution générique.

Répondre

8

Python 2.6 a la fonction itertools.product() qui fait ce que vous voulez:

import itertools 
v = (a, b, c) 
for d, e, f in itertools.product(*(generate(x) for x in v)): 
    print d, e, f 

De la documentation:

produit cartésien de iterables d'entrée.

Equivalent à des boucles for imbriquées dans une expression de générateur . Par exemple, le produit (A, B) renvoie le même que ((x, y) pour x dans A pour y dans B).

+0

Apparemment utile, comment pourrais-je parcourir le résultat? –

+1

@Yuval: 'pour i dans le produit (* (generate (x) pour x dans v)): do_whatever_you_want (i)' – kennytm

+0

Wicked. et la réponse est déjà mise à jour pour refléter cela ... –