[pyar] Longitud de un iterador

claudio canepa ccanepacc en gmail.com
Jue Ene 13 18:09:21 ART 2011


2011/1/13 Anthony Lenton <antoniolenton en gmail.com>

> 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
> _______________________________________________
>


Yo diria que el mecanismo standard es justamente definir el metodo magico
__len__:

>>> class A(object):
... def __len__(self):
... return 42
...
>>> a = A()
>>> len(a)
42
>>>

--
claudio
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20110113/20323176/attachment.html>


More information about the pyar mailing list