2012-06-08 21 views
6

Qual è il modo più poderato e/o efficace per contare il numero di caratteri in una stringa che è in minuscolo?Contare caratteri minuscoli in una stringa

Ecco la prima cosa che mi venne in mente:

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

avete provato questo fuori? –

+1

Si dovrebbe usare generatore di comprensione 'sum (int (c.islower()) per c nella stringa)' – Akavall

+1

E non è necessaria la parte 'int'. Funzionerebbe: 'sum (c.islower() per c nella stringa)' – Akavall

risposta

11

Clever trucco del tuo! Tuttavia, trovo più leggibile filtrare i caratteri più bassi, aggiungendo 1 per ciascuno.

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

+1 per la versione che funziona con i bytestrings, le stringhe Unicode, Python 2, Python 3 in modo efficiente per la memoria. – jfs

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

È possibile dimezzare il tempo di calcolo sostituendo l'espressione lambda con 'str.islower' –

+2

Solo ora so che' In [39]: sum ([True, True, False, False, True]) Out [39 ]: 3' dopo averlo eseguito nella shell. – iMom0

+0

@JoelCornett bel suggerimento - inserendolo sopra :) –

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

+1. 'filter()' su Python 2 restituisce una stringa se input è una stringa in modo che non mangi più del doppio della memoria e nella maggior parte dei casi dovrebbe essere più veloce di 'sum()' su un generatore. Anche se 'len (filter())' si interrompe su Python 3 dove restituisce un iteratore. – jfs

1

Se si desidera dividere le cose un po 'più di precisione:

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) 
Problemi correlati