Contar digitos en un string

Arnau Sanchez pyarnau en gmail.com
Mie Dic 17 11:48:08 CET 2008


Chema Cortes escribió:

> El Tuesday 16 December 2008 23:33:28 Arnau Sanchez escribió:
>> lasizoillo escribió:
>>>> ¿Como podría hacer para contar el número de digitos ( números ) en una
>>>> cadena de texto?
>>> In [1]: a = "asdfsadf234dfs234sdf45345"
>>>
>>> In [2]: len([x for x in a if x.isdigit()])
>>> Out[2]: 11
>> Correcto, pero se crea una lista intermedia que usa memoria sin necesidad.
>>
>> Una alternativa es usar generadores:
>>  >>> sum(1 for c in a if c.isdigit())
>>
>> 11
> 
> Había pensado en esta alternativa, pero sus ventajas no compensa el liar más 
> el código. Por lo general, este tipo de comprobaciones se hacen en la 
> introducción de datos en formularios, por lo que las cadenas no suelen ser 
> demasiado largas.

Sí, sí, claro, más que nada quería resaltar el detalle de la lista intermedia. 
Personalmente me gusta mucho la programación funcional y suelo tener ya creadas 
funciones como "iterlen" (que devuelve la longitud de un generador); por ese 
camino se podría escribir:

iterlen(ifilter(str.isdigit, a))

donde:

def iterlen(it):
     return sum(1 for _ in it)

Aunque el consenso es que se entienden mejor las comprensiones de 
listas/generadores.

Pero en fin, por claridad me quedaría con la versión de lasizoilo y listo.

> Pero si es por optimizar, ésta sería una mejor solución:
> 
>  sum(a.count(c) for c in "0123456789")
> 
> Son sólo 9 sumas, independientemente de la longitud de la cadena.

Sí, ¿pero no hay que considerar además que cada count() debe recorrer completa 
la lista? aún así, seguro que ésta es la forma más rápida, de largo (debido a 
que la iteración la hace en C en vez de en Python).


-- 
Web: http://www.arnau-sanchez.com
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es