2010-07-11 5 views
20

J'ai une fonction de générateur et je veux en obtenir les dix premiers éléments; ma première tentative était:Obtenir un sous-ensemble d'un générateur

my_generator()[:10] 

Cela ne fonctionne pas parce que les générateurs ne sont pas indicables, comme l'erreur me le dit. En ce moment j'ai travaillé autour de cela avec:

list(my_generator())[:10] 

Cela fonctionne depuis qu'il convertit le générateur en liste; Cependant, il est inefficace et va à l'encontre de l'idée d'avoir un générateur. Existe-t-il un équivalent Pythonic intégré de [:10] pour les générateurs?

Répondre

25
import itertools 

itertools.islice(mygenerator(), 10) 

itertools a un certain nombre d'utilitaires pour travailler avec les itérateurs. islice prend les arguments start, stop et step pour découper un itérateur comme vous le feriez pour une liste.

+1

utilisent réellement: itertools.islice (mygenerator(), 10) – Martlark

+0

@martlark: Uhm, pas Ned avait la version correcte. – SilentGhost

+1

@SilentGhost bien, quand je l'ai essayé j'ai eu cette erreur: importer itertools def sumUp(): x = 20; z = 0 pour y dans la plage (x + 1): z + = 1 rendement z pour z dans itertools.islice (sumUp, 5): impression z retraçage (appel le plus récent dernier): Fichier "C: \ Data Code \ \ Febrl \ src \ z.py", ligne 9, dans pour z dans itertools.islice (sumUp, 5): TypeError: l'objet 'de la fonction' est pas iterable python 2,6 – Martlark

5

pour clarifier les commentaires ci-dessus:

from itertools import islice 

def fib_gen(): 
    a, b = 1, 1 
    while True: 
     yield a 
     a, b = b, a + b 

assert [1, 1, 2, 3, 5] == list(islice(fib_gen(), 5)) 
+0

+1 pour l'exemple de code de travail. –