[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