2009-07-20 11 views

Respuesta

920

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

devolver el número de ocurrencias no solapados de subcadena sub en el intervalo [start, end]. Los argumentos opcionales start y end se interpretan como en notación de división.

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

string.count! Eso es súper conveniente – peterb

43

¿Expresiones regulares quizás?

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

Una buena idea, pero exagerada en este caso. El método de cadena 'conteo' hace lo mismo con la ventaja añadida de ser inmediatamente obvio sobre lo que está haciendo. – nilamo

+15

por qué tasa negativa, tal vez alguien necesita este tipo de código para algo similar. mi voto hasta – kiltek

+2

de acuerdo con kiltek - esto es sólo el caso más general ... –

109

Puede utilizar count():

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

más información here

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

Como otras respuestas Dicho esto, mediante el recuento método de cadena() es probablemente la más simple , pero si lo haces con frecuencia, mira collections.Counter:

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

¿Por qué es esto mejor cuando se usa con frecuencia? ¿Cuál es la ventaja? – meshy

+9

Si quiere los conteos de muchas de las letras en una cadena dada, Counter las proporciona todas de una forma más sucinta. Si desea contar una letra de una gran cantidad de cadenas diferentes, Counter no proporciona ningún beneficio. –

+0

@BrendenBrown ¿Hay una diferencia de rendimiento notable? –

8

Las expresiones regulares son muy útiles si quieres caso insensibilidad (y, por supuesto, todo el poder de expresiones regulares).

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

Tenga en cuenta que la versión de expresiones regulares toma del orden de diez veces más tiempo para funcionar, lo que probablemente será un problema sólo si mi_cadena es tremendamente largo, o el código está dentro de un bucle de profundidad.

+0

Regex es exagerado si solo está tratando de corregir la sensibilidad de mayúsculas y minúsculas. my_sting.lower(). count ('m') es más eficiente, más claro y más sucinto. –

2

"Sin usar el contador para buscar el carácter que desee en la cadena" método.

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

¿Por qué la función de conteo vacío? ¿Por qué la función main()?¿Por qué los espacios feos en todas partes? Esta NO es una buena respuesta. – 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

No más de esto en mi humilde opinión - puede agregar los métodos superiores o inferiores

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) es la mejor solución para contar un único carácter en una cadena . Pero si necesita contar más caracteres que uno, tendrá que leer la cadena tantas veces como los caracteres que quiera contar.

Un mejor enfoque para este trabajo sería:

from collections import defaultdict 

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

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

por lo que tendrá un diccionario que devuelve el número de ocurrencias de cada letra de la cadena y 0 si no está presente.

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

Básicamente está reimplementando 'Counter', que ya es una clase en' collections'. – merv

+0

@merv Realmente no. 'Counter' es una clase Python pura más inflada y' __missing__' de 'defaultdict' está [escrita en C] (https://hg.python.org/cpython/file/7272ef213b7c/Modules/_collectionsmodule.c#l1484) . Para una tarea simple como esta ('int' también se implementa en C) este enfoque es ligeramente más rápido. –

-1

Esto le dará la ocurrencia de cada carácter en una cadena.O/P es también en formato de cadena:

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 es sin duda la forma más concisa y eficiente de contar la ocurrencia de un carácter en una cadena pero traté de llegar a una solución con lambda , algo como esto:

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

esto dará como resultado:

4 

Además, hay una ventaja más de esto si la oración es una lista de subcadenas que contienen los mismos caracteres que los anteriores, y también da el resultado correcto debido al uso de in. Echar un vistazo:

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

Esto también se traduce en:

4 

Pero, por supuesto, esto va a funcionar sólo cuando la comprobación ocurrencia de carácter individual como 'a' en este caso particular.

Cuestiones relacionadas