EDIT 3: La réponse par @hynekcer est beaucoup mieux que cela.
EDIT 2: Cela ne fonctionnera pas si vous avez un itérateur infini, ou qui consomme trop de Gigaoctets (en 2010 1 Go est encore une grande quantité d'espace de RAM/disque) de RAM/espace disque .
Vous avez déjà vu une bonne réponse, mais voici un hack coûteux que vous pouvez utiliser si vous voulez manger un gâteau et l'avoir aussi :) L'astuce est que nous devons cloner le gâteau, et quand vous êtes fait manger, nous le remettons dans la même boîte. Rappelez-vous que lorsque vous itérez sur l'itérateur, il devient généralement vide ou perd au moins les valeurs précédemment retournées.
>>> 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: Voici une version plus sûre, mais il nécessite encore une certaine discipline. Il ne se sent pas tout à fait Pythonic. Vous obtiendrez la meilleure solution si vous avez publié l'intégralité de l'exemple de code pertinent que vous essayez de mettre en œuvre.
>>> 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>
>>>
double possible: http://stackoverflow.com/questions/3345785/getting-number-of-elements-in-an-iterator-in -python/ – Daenyth
Si vous collez le code avec lequel vous travaillez, nous serons peut-être en mesure de trouver de meilleures réponses. –