2017-01-03 2 views
1

J'ai cette fonction g() mon but est de produire un résultat similaire à product() mais avec un nombre d'apparence contraint pour chaque groupe de caractères. Donc, dans le code ci-dessous au lieu de faire product(a, repeat=3)g() est censé donner toutes les combinaisons où les caractères de a apparaissent 2 fois et les caractères de b apparaissent 1 fois. Voici ce que j'ai:Comment aplatir le rendement lors de la production d'un générateur?

from itertools import permutations, product 

a='ABC' 
b=['*', '%3A'] 
l=[a]*2+[b] 

def g(list): 
    for p in permutations(list): 
     yield product(*p) 


result=g(l) 

Le problème que je suis face est que lorsque je yield le résultat que je suis un itérateur imbriqué qui est pénible à utiliser et quand je l'utilise retourner retourne juste le générateur correspondant à seulement le premier tour de boucle, comme si je l'ai fait: g() seulement composé de def g(): return product(*next(permutations(list))).

+0

Pensez à ce que vous feriez si vous étiez pas en train d'écrire un générateur 'g', et que vous vouliez juste appelle 'some_function (x)' sur chaque combinaison. Ecrivez ce code, puis remplacez 'some_function' par' yield'. – user2357112

+0

Quelle version de python ciblez-vous (en vous demandant si 'yield from' pourrait être utilisé ici)? – snakecharmerb

+0

@snakecharmerb python 3, oh oui tu as raison il y a 'rendement de' j'ai totalement oublié, j'ai résolu le problème en utilisant 'c = chaîne (c, produit (* p))' et en revenant c à la fin, avait le idée juste après l'affichage de cela. – ChiseledAbs

Répondre

3

Si vous êtes python 3.3 ou une version ultérieure, vous pouvez utiliser PEP 380: Syntax for Delegating to a Subgenerator ... Il suffit de faire yield from

from itertools import permutations, product 

a='ABC' 
b=['*', '%3A'] 
l=[a]*2+[b] 

def g(list): 
    for p in permutations(list): 
     yield from product(*p) 


result=g(l) 
+0

J'ai oublié le rendement de merci pour la pointe c'est utile – ChiseledAbs