[pyar] Longitud de un iterador

Alejandro Santos listas en alejolp.com
Jue Ene 13 18:36:46 ART 2011


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 :(

-- 
Alejandro Santos
http://alejolp.com.ar



More information about the pyar mailing list