Voglio sapere se una sequenza generata ha meno di 2 voci.Come sapere che una sequenza generata è al massimo una certa lunghezza
>>> def sequence():
... for i in xrange(secret):
... yield i
Il mio metodo inefficiente è quello di creare una lista, e misurare la sua lunghezza:
>>> secret = 5
>>> len(list(sequence())) < 2
True
Ovviamente, questo consuma l'intero generatore.
Nel mio caso reale il generatore potrebbe attraversare una grande rete. Voglio fare il controllo senza consumare l'intero generatore o costruire una grande lista.
C'è un recipe in the itertools documentation:
def take(n, iterable):
"Return first n items of the iterable as a list"
return list(islice(iterable, n))
Si costruisce solo un elenco di lunghezza massima n
, che è meglio.
Così ho potuto dire:
>>> len(take(2, sequence()) < 2
Esiste un modo efficiente ancora più divinatorio di farlo?
Questa è una grande domanda Peter Wood - Il mio approccio ingenuo sarebbe quello di produrre un tentativo due elementi e li memorizza, ma deve esserci un modo migliore. Sono curioso a riguardo. Dubito che un generatore possa conoscere le sue dimensioni prima di essere consumato. –
Silenziosamente non correlate ma come regola generale fai attenzione con 'list (iterator)', gli iteratori possono essere infiniti ... –
Sicuramente la domanda chiave è - come faresti a saperlo, * senza * consumare l'iteratore, se sarà abbastanza lungo (o abbastanza breve? Il tuo titolo sembra essere in conflitto con la domanda)? Hai altre informazioni che potrebbero permetterti di determinare questo? – jonrsharpe