2012-06-08 24 views
6

¿Cuál es la forma más pitónica y/o eficiente de contar la cantidad de caracteres en una cadena que son minúsculas?Contar los caracteres en minúscula en una cadena

Aquí es lo primero que vino a la mente:

def n_lower_chars(string): 
    return sum([int(c.islower()) for c in string]) 
+0

usted intentó esto? –

+1

Debe usar la comprensión del generador 'sum (int (c.islower()) para c en la cadena)' – Akavall

+1

Y no necesita la parte 'int'. Esto funcionaría: 'sum (c.islower() para c en la cadena)' – Akavall

Respuesta

11

truco inteligente de los suyos! Sin embargo, me parece más legible filtrar los caracteres inferiores, agregando 1 para cada uno.

def n_lower_chars(string): 
    return sum(1 for c in string if c.islower()) 
+1

+1 para la versión que funciona para cadenas de bytes, cadenas Unicode, Python 2, Python 3 de una manera eficiente de la memoria. – jfs

3
def n_lower_chars(string): 
    return sum(map(str.islower, string)) 
+2

Puede reducir el tiempo de cálculo a la mitad reemplazando su expresión lambda con 'str.islower' –

+2

Solo ahora sé que' En [39]: sum ([True, True, False, False, True]) Fuera [39 ]: 3' después de ejecutarlo en shell. – iMom0

+0

@JoelCornett sugerencia agradable - poniéndolo en :) :) –

6
def n_lower_chars(string): 
    return len(filter(str.islower, string)) 
+1

+1. 'filter()' en Python 2 devuelve una cadena si la entrada es una cadena por lo que no consumirá más del doble de memoria y debería ser más rápido que 'suma()' en un generador en la mayoría de los casos. Aunque 'len (filter())' se rompe en Python 3, donde devuelve un iterador. – jfs

1

Si desea dividir las cosas un poco más finamente:

from collections import Counter 

text = "ABC abc 123" 
print Counter("lower" if c.islower() else 
       "upper" if c.isupper() else 
       "neither" for c in text) 
Cuestiones relacionadas