EDIT 3: La risposta da @hynekcer è molto molto meglio di questo.
EDIT 2: Questo non funziona se si dispone di un iteratore infinita, o uno che consuma troppo molti gigabyte (nel 2010 1 Gigabyte è ancora una grande quantità di ram/spazio su disco) di RAM/spazio su disco .
Avete già visto una buona risposta, ma qui è un trucco costoso che è possibile utilizzare se si vuole mangiare una torta e averla troppo :) Il trucco è che abbiamo di clonare la torta, e quando si è fatto mangiare, lo rimettiamo nella stessa scatola. Ricorda, quando si itera su iteratore, di solito diventa vuoto, o almeno perde valori restituiti in precedenza.
>>> def getIterLength(iterator):
temp = list(iterator)
result = len(temp)
iterator = iter(temp)
return result
>>>
>>> f = xrange(20)
>>> f
xrange(20)
>>>
>>> x = getIterLength(f)
>>> x
20
>>> f
xrange(20)
>>>
EDIT: Ecco una versione più sicura, ma il suo utilizzo richiede ancora un po 'di disciplina. Non sembra abbastanza pitonico. Otterrai la soluzione migliore se pubblichi l'intero campione di codice rilevante che stai tentando di implementare.
>>> def getIterLenAndIter(iterator):
temp = list(iterator)
return len(temp), iter(temp)
>>> f = iter([1,2,3,7,8,9])
>>> f
<listiterator object at 0x02782890>
>>> l, f = getIterLenAndIter(f)
>>>
>>> l
6
>>> f
<listiterator object at 0x02782610>
>>>
fonte
2010-07-27 19:32:29
Eventuali duplicati: http://stackoverflow.com/questions/3345785/getting-number-of-elements-in-an-iterator-in -python/ – Daenyth
Se si incolla il codice con cui si sta lavorando, potremmo riuscire a trovare risposte migliori. –