Contar digitos en un string

Arnau Sanchez pyarnau en gmail.com
Mie Dic 17 12:19:37 CET 2008


antonio escribió:

> El mié, 17-12-2008 a las 02:51 +0100, 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.
>>
>> 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.
> 
> hablando de optimización.
> 
> ¿No será más rápido, y ocupará menos memoria hacer la suma "a mano"?
> x=0
> for i in a:
> 	if i>="0" and i<="9":
> 		x+=1
> 

No, piensa que en las líneas que usamos "sum" se hace una comprensión de 
generador, no se gasta más memoria (ya que no se genera lista intermedia), la 
suma se hace al vuelo.

Es un ejemplo clásico entre una implementación iterativa y otra funcional. Estas 
dos funciones son equivalentes:

def fun_iterativa(valor_inicial):
     resultado = valor_inicial
     for elemento in iterable:
         resultado = operacion(resultado, elemento)
     return resultado

def fun_funcional(valor_inicial):
     return reduce(operacion, iterable, valor_inicial)

Estarás de acuerdo que, sabiendo qué hace "reduce", es mucho más compacta y 
clara la segunda. En nuestro caso, "sum" no deja de ser un "reduce(operator.add, 
...)"

Aunque Python no es lenguaje funcional, se pueden aplicar algunos de sus 
principios. Te recomiendo que le eches una ojeada a links sobre el tema:

http://www.amk.ca/python/writing/functional
http://www.ibm.com/developerworks/library/l-prog.html

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