2013-08-08 16 views
16

Sto cercando di capire come posso contare le lettere maiuscole in una dichiarazione.Contare le lettere maiuscole in una stringa

Ho solo stato in grado di trovare le minuscole:

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

esempio di quello che sto cercando di realizzare:

Type word: HeLLo           
Capital Letters: 3 

Quando provo a capovolgere, legge errori:

def n_upper_chars(string): 
    return sum(map(str.isupper, string)) 
+1

Hai provato qualcosa? –

+0

Per prima cosa, benvenuto su 'stackoverflow'. Anche se la tua domanda è chiara, non hai fornito alcun codice. Google prima e prova a scrivere del codice. Se sei bloccato, inserisci qui il codice. –

+0

È molto facile, fare questo tipo di domande significa solo dimostrare che non hai fatto il tuo sforzo. Neanche su google. – Sankumarsingh

risposta

33

È possibile farlo con sum, a generator expression e str.isupper:

message = input("Type word: ") 

print("Capital Letters: ", sum(1 for c in message if c.isupper())) 

vedere una dimostrazione di seguito:

>>> message = input("Type word: ") 
Type word: aBcDeFg 
>>> print("Capital Letters: ", sum(1 for c in message if c.isupper())) 
Capital Letters: 3 
>>> 
+0

Non che importi così tanto, ma perché non '% d' invece di'% s'? –

+1

'% s' chiama str() (quindi overhead) sul suo argomento ...'% d' è lo stesso di '% i' e 1) ha più senso per un argomento intero e 2) è più facile da regolare su buttare in '% 03d' ecc ... –

+0

bello! ma che dire: 'sum (1 per x nel messaggio se x.isupper())'? So che True è '1', ma sembra più elegante sommare interi ma booleani o no? – danihp

2
from string import ascii_uppercase 
count = len([letter for letter in instring if letter in ascii_uppercase]) 

Questo non è il modo più veloce, ma mi piace come è leggibile. Un altro modo, senza importare dalla corda e con una sintassi simile, sarebbe:

count = len([letter for letter in instring if letter.isupper()]) 
+0

Accetto. Con questo posso vedere cosa sta succedendo. – Stevenson

+0

@Stevenson Puoi anche usare "maiuscolo" anziché "ascii_uppercase" se trovi che sia più leggibile. Puoi leggere le differenze tra i due [qui] (http://docs.python.org/2/library/string.html#string-constants). – mr2ert

+0

Impressionante ... che mi dia una migliore comprensione! ottimo link – Stevenson

6

Utilizzando len e filter:

import string 
value = "HeLLo Capital Letters" 
len(filter(lambda x: x in string.uppercase, value)) 
>>> 5 
+0

@Keyser: corretto, ho letto troppo velocemente e anche se le lettere maiuscole erano nell'esempio. (che sembra essere pochi minuti fa) – njzk2

3

È possibile utilizzare re:

import re 
string = "Not mAnY Capital Letters" 
len(re.findall(r'[A-Z]',string)) 

0

L'(leggermente) metodo più veloce per questo sembra davvero di essere in un test di appartenenza frozenset

import string 
message='FoObarFOOBARfoobarfooBArfoobAR' 
s_upper=frozenset(string.uppercase) 

%timeit sum(1 for c in message if c.isupper()) 
>>> 100000 loops, best of 3: 5.75 us per loop 

%timeit sum(1 for c in message if c in s_upper) 
>>> 100000 loops, best of 3: 4.42 us per loop 
1

Questo funziona

s = raw_input().strip() 
count = 1 
for i in s: 
    if i.isupper(): 
     count = count + 1 
print count 
Problemi correlati