2017-07-25 2 views
1

Disons que j'ai une fonction de générateur qui produit deux valeurs:Récupération toutes les valeurs de iterator de la fonction générateur

def gen_func(): 
    for i in range(5): 
     yield i, i**2 

Je veux récupérer toutes les valeurs de iterator de ma fonction. Actuellement, j'utilise cet extrait de code à cette fin:

x1, x2 = [], [] 
for a, b in gen_func(): 
    x1.append(a) 
    x2.append(b) 

Cela fonctionne pour moi, mais semble un peu maladroit. Existe-t-il un moyen plus compact de coder cela? Je pensais quelque chose comme:

x1, x2 = map(list, zip(*(a, b for a, b in gen_func()))) 

Ceci, cependant, me donne juste une erreur de syntaxe. PS: Je suis conscient que je ne devrais probablement pas utiliser un générateur à cette fin, mais j'en ai besoin ailleurs.

Modifier: N'importe quel type pour x1 et x2 fonctionnerait, cependant, je préfère la liste pour mon cas.

+0

Quel est le type désiré de x1 et x2? Liste? Tuple? Quelque chose d'aussi long que c'est itérable? – Kevin

+0

Je préférerais la liste. Merci pour la remarque, j'ai mis à jour ma question. – Nyps

Répondre

5

Si x1 et x2 peut être tuples, il est suffisant pour faire

>>> x1, x2 = zip(*gen_func()) 
>>> x1 
(0, 1, 2, 3, 4) 
>>> x2 
(0, 1, 4, 9, 16) 

Sinon, vous pouvez utiliser map pour appliquer list au iterator:

x1, x2 = map(list, zip(*gen_func())) 

Juste pour le plaisir, la même chose peut être fait en utilisant un déballage itérable prolongé:

>>> (*x1,), (*x2,) = zip(*gen_func()) 
>>> x1 
[0, 1, 2, 3, 4] 
>>> x2 
[0, 1, 4, 9, 16] 
+1

Code comme ceci est la raison pour laquelle j'aime tellement Python ... –

+0

Merci pour le bon résumé des possibilités! – Nyps

3

Vous avait presque il:

x1, x2 = map(list, zip(*gen_func()))