2010-07-11 17 views
20

Ho una funzione di generatore e voglio ottenere i primi dieci elementi da esso; il mio primo tentativo è stato:Ottenere un sottoinsieme di un generatore

my_generator()[:10] 

Questo non funziona perché i generatori non sono abbonati, come mi dice l'errore. In questo momento ho lavorato intorno a quella con:

list(my_generator())[:10] 

Questo funziona poiché converte il generatore ad una lista; tuttavia, è inefficiente e sconfigge il punto di avere un generatore. Esiste un equivalente pitonico incorporato di [:10] per i generatori?

risposta

25
import itertools 

itertools.islice(mygenerator(), 10) 

itertools ha un numero di utilità per il funzionamento con iteratori. islice accetta gli argomenti start, stop e step per tagliare un iteratore proprio come si farebbe con un elenco.

+1

effettivamente utilizzare: itertools.islice (mygenerator(), 10) – Martlark

+0

@martlark: uhm, no Ned aveva versione corretta. – SilentGhost

+1

@SilentGhost bene, quando ho provato ho ottenuto questo errore: import itertools def sumUp(): x = 20; z = 0 for y in range (x + 1): z + = 1 resa z per z a itertools.islice (sumUp, 5): stampa z Traceback (chiamata più recente scorso): file "C: \ Data \ \ code Febrl \ src \ z.py", linea 9, in per z a itertools.islice (sumUp, 5): TypeError: 'funzione' oggetto non è iterabile pitone 2.6 – Martlark

5

per chiarire i commenti di cui sopra:

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 per esempio di codice di lavoro. –

Problemi correlati