[pyar] Longitud de un iterador
Anthony Lenton
antoniolenton en gmail.com
Jue Ene 13 18:03:06 ART 2011
Hay una pregunta dando vueltas por varios lados, en las que parece
haber siempre la misma respuesta:
Q: Cómo calculo la longitud de un iterador?
A: No se puede en el caso general.
Pero.. Y en los casos en que *si* se puede??
Vamos del principio:
Supongamos que tengo un iterador del que conozco la cantidad de veces
que voy a poder llamar a next() antes de que tire StopIteration.
Puede ser
>>> miiterador = list('hola mundo').__iter__()
o bien
>>> migenerador = (mifuncion(a) for a in range(10))
por ejemplo. Idealmente quisiera poder decir len(migenerador) y que
me diga 10 pero, claro, no se puede en el caso general. Ahora:
*No* quiero instanciar una lista con esto porque podría ser una lista
muy grande, o mifuncion(a) devuelve objetos muy pesados (hey, si no
por qué usabamos iteradores? :) )
*No* quiero tener que consumir el iterador para calcularle la
longitud, porque ademas mifuncion() tarda mucho.
Y le quiero pasar este generador a una función que yo no controlo, y
que va a llamar a len(migenerador)
Lo puedo arreglar con algo tipo:
class MiIteradorQueSabeSuLongitud(object):
def __init__(self, iterador, length):
self.length = length
self.iterador = iterador
def __iter__(self):
return self
def next(self):
return self.iterador.next()
def __len__(self):
return self.length
Y pasarle a la función MiIteradorQueSabeSuLongitud(migenerador, 20) en vez.
Ahora, no hay algo así en la librería estandard, que lo resuelva lindo
en 0 lineas de código?
No digo el caso general, si no solo para cuando realmente sé lo que va
a hacer el iterador, no le puedo decir "ah, de paso, tu longitud es
tanto"?
Agradecido,
--
Anthony Lenton
More information about the pyar
mailing list