2009-07-20 13 views

risposta

920

str.count(sub[, start[, end]])

ritorno il numero di occorrenze non sovrapposte di sottostringa sub nell'intervallo [start, end]. Gli argomenti opzionali start e end vengono interpretati come nella notazione di sezione.

>>> sentence = 'Mary had a little lamb' 
>>> sentence.count('a') 
4 
+6

string.count! È super conveniente – peterb

43

Espressioni regolari, forse?

import re 
my_string = "Mary had a little lamb" 
len(re.findall("a", my_string)) 
+21

Un'ottima idea, ma eccessivo in questo caso. Il metodo "conteggio" della stringa fa la stessa cosa con il vantaggio aggiuntivo di essere immediatamente ovvio su ciò che sta facendo. – nilamo

+15

perché il tasso negativo, forse qualcuno ha bisogno di questo tipo di codice per qualcosa di simile. il mio voto su – kiltek

+2

è d'accordo con kiltek - questo è solo il caso più generale ... –

109

È possibile utilizzare count():

>>> 'Mary had a little lamb'.count('a') 
4 
23
myString.count('a'); 

maggiori informazioni here

14
"aabc".count("a") 
77

Come altre risposte detto, utilizzando il numero di metodo di stringa() è probabilmente il più semplice , ma se lo fai frequentemente, dai un'occhiata a collections.Counter:

from collections import Counter 
str = "Mary had a little lamb" 
counter = Counter(str) 
print counter['a'] 
+11

Perché è meglio se usato frequentemente? Qual è il vantaggio? – meshy

+9

Se si desidera il conteggio di molte lettere in una determinata stringa, Counter fornisce tutte le lettere in una forma più succinta. Se vuoi il conteggio di una lettera da molte stringhe diverse, Counter non offre alcun vantaggio. –

+0

@BrendenBrown Esiste una notevole differenza di prestazioni? –

8

Le espressioni regolari sono molto utili se si desidera caso-insensibilità (e, naturalmente, tutta la potenza del regex).

my_string = "Mary had a little lamb" 
# simplest solution, using count, is case-sensitive 
my_string.count("m") # yields 1 
import re 
# case-sensitive with regex 
len(re.findall("m", my_string)) 
# three ways to get case insensitivity - all yield 2 
len(re.findall("(?i)m", my_string)) 
len(re.findall("m|M", my_string)) 
len(re.findall(re.compile("m",re.IGNORECASE), my_string)) 

essere consapevoli del fatto che la versione regex assume dell'ordine di dieci volte più a lungo per l'esecuzione, che sarà probabilmente un problema solo se my_string è tremendamente lungo, o il codice è all'interno di un ciclo profondo.

+0

Regex è eccessivo se stai solo provando a correggere la distinzione tra maiuscole e minuscole. my_sting.lower(). count ('m') è più performante, più chiaro e più succinto. –

2

"Senza utilizzare il conteggio per trovare il carattere desiderato nella stringa" metodo.

import re 

def count(s, ch): 

    pass 

def main(): 

    s = raw_input ("Enter strings what you like, for example, 'welcome': ") 

    ch = raw_input ("Enter you want count characters, but best result to find one character: ") 

    print (len (re.findall (ch, s))) 

main() 
+4

Perché la funzione di conteggio vuoto? Perché la funzione main()?Perché gli spazi brutti ovunque? Questa NON è una buona risposta. – bugmenot123

3
a = 'have a nice day' 
symbol = 'abcdefghijklmnopqrstuvwxyz' 
for key in symbol: 
    print key, a.count(key) 
0
spam = 'have a nice day' 
var = 'd' 


def count(spam, var): 
    found = 0 
    for key in spam: 
     if key == var: 
      found += 1 
    return found 
count(spam, var) 
print 'count %s is: %s ' %(var, count(spam, var)) 
0

Non più di questo IMHO - è possibile aggiungere i metodi superiori o inferiori

def count_letter_in_str(string,letter): 
    return string.count(letter) 
2
str = "count a character occurance" 

List = list(str) 
print (List) 
Uniq = set(List) 
print (Uniq) 

for key in Uniq: 
    print (key, str.count(key)) 
3

str.count(a) è la soluzione migliore per contare un singolo carattere in una stringa . Ma se hai bisogno di contare più caratteri di uno, dovresti leggere la stringa tante volte quante sono i personaggi che vuoi contare.

Un approccio migliore per questo lavoro potrebbe essere:

from collections import defaultdict 

string = 'Mary had a little lamb' 
chars = defaultdict(int) 

for char in string: 
    chars[char] += 1 

così avrete un dict che restituisce il numero di occorrenze di ogni lettera nella stringa e 0 se non è presente.

>>>chars['a'] 
4 
>>>chars['x'] 
0 
+0

In pratica stai reimplementando 'Counter', che è già una classe in' collections'. – merv

+0

@merv Non proprio. 'Counter' è una classe Python pura più gonfia e' defaultdict''s '__missing__' è [scritto in C] (https://hg.python.org/cpython/file/7272ef213b7c/Modules/_collectionsmodule.c#l1484) . Per un compito semplice come questo ('int' è anche implementato in C) questo approccio è leggermente più veloce. –

-1

Questo vi darà l'occorrenza di ciascun carattere in una stringa.O/P è anche in formato stringa:

def count_char(string1): 
string2="" 
lst=[] 
lst1=[] 
for i in string1: 
    count=0 
    if i not in lst: 
     for j in string1: 
      if i==j: 
       count+=1 
     lst1.append(i) 
     lst1.append(count) 
    lst.append(i) 

string2=''.join(str(x) for x in lst1) 
return string2 

print count_char("aabbacddaabbdsrchhdsdg") 
1

count è sicuramente il modo più concisa ed efficace di contare il verificarsi di un carattere in una stringa ma ho cercato di trovare una soluzione con lambda , qualcosa di simile:

sentence = 'Mary had a little lamb' 
sum(map(lambda x : 1 if 'a' in x else 0, sentence)) 

questo si tradurrà in:

4 

Inoltre, c'è un altro vantaggio in questo caso se la frase è una lista di sotto-stringhe contenenti gli stessi caratteri di cui sopra, quindi anche questo dà il risultato corretto a causa dell'uso di in. Date un'occhiata:

sentence = ['M', 'ar', 'y', 'had', 'a', 'little', 'l', 'am', 'b'] 
sum(map(lambda x : 1 if 'a' in x else 0, sentence)) 

Ciò si traduce anche in:

4 

ma portate questo funziona solo al momento del check verificarsi di singolo carattere, come 'a' in questo caso particolare.

Problemi correlati