[pyar] Longitud de un iterador

Anthony Lenton antoniolenton en gmail.com
Jue Ene 13 19:43:26 ART 2011


2011/1/13 Alejandro Santos <listas en alejolp.com>:
> 2011/1/13 Anthony Lenton <antoniolenton en gmail.com>:
>> 2011/1/13 Alejandro Santos <listas en alejolp.com>:
>>> 2011/1/13 Anthony Lenton <antoniolenton en gmail.com>:
>>>> 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"?
>>>>
>>>
>>>>>> list("hola").__iter__().__length_hint__()
>>> 4
>>>>>> iter("hola").__length_hint__()
>>> 4
>>>>>> iter((x for x in "hola")).__length_hint__()
>>> Traceback (most recent call last):
>>>  File "<stdin>", line 1, in <module>
>>> AttributeError: 'generator' object has no attribute '__length_hint__'
>>>
>>> Lo mas chico que pude es 1 linea de código, 0 se me complica.
>>
>> Muy bueno!
>>
>> Lástima que justo para los generadores no viene __length_hint__.
>> Y, aún con __length_hint__() len() no funciona -- necesitaría poder
>> llamar a len() para poder pasarlo a una función que espera una
>> secuencia/bichoquetienelen.  Leyendo un poco parece que
>> __length_hint__ lo usan "algunos métodos internos para operar de
>> manera más eficiente"[1], pero len() lo ignora por completo.
>>
>
> Tampoco está documentado, pero es mejor que nada. El problema con los
> generadores es que es un caso demasiado específico para hacerlo andar
> en Python.
>
> En tu ejemplo:
>
>>>> migenerador = (mifuncion(a) for a in range(10))
>
> La longitud es diez, pero es un caso demasiado especial como para que
> Python lo sepa. Una minima diferencia en el codigo hace que sea aun
> mucho mas complejo:
>
>>>> import random
>>>> migenerador = (mifuncion(a) for a in range(random.randint(0, 100)))
>
> Y ya no es tan fácil saber la longitud :(

Sí, True, tiene que ser algo explícito donde le avises vos la longitud
si querés, no tiene sentido que lo adivine solo.  Tenía ganas de que
hubiera algo ya hecho para justo este caso en itertools, o en
antigravity o por ahí...


-- 
Anthony Lenton



More information about the pyar mailing list