Cuenta el número de ocurrencias de un personaje en una cadena


954

¿Cuál es la forma más sencilla de contar el número de ocurrencias de un personaje en una cadena?

Por ejemplo, contar el número de veces que 'a'aparece en'Mary had a little lamb'

Respuestas:


1332

str.count (sub [, inicio [, fin]])

Devuelve el número de ocurrencias no superpuestas de subcadena suben el rango [start, end]. Argumentos opcionales starty endse interpretan como en notación de corte.

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


112

Como decían otras respuestas, usar el método de cadena count () es probablemente el más simple, pero si lo hace con frecuencia, consulte las colecciones .

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

15
¿Por qué es esto mejor cuando se usa con frecuencia? Cual es la ventaja?
meshy

21
Si desea los recuentos de muchas letras en una cadena dada, Counter las proporciona a todas en una forma más sucinta. Si desea el recuento de una letra de muchas cadenas diferentes, Counter no ofrece ningún beneficio.
Brenden Brown

2
Para esta instancia particular, contando caracteres, preferiría collections.counter. Para encontrar instancias de una subcadena específica, usaría una expresión regular o el método str.count (). No lo he probado, pero puede haber una diferencia de rendimiento debido a una ligera sobrecarga al contar todos los caracteres y agregarlos a un diccionario en lugar de contar las ocurrencias de una sola subcadena. Sugeriría escribir un script para generar un archivo muy largo para buscar y luego sincronizar la ejecución de cada método.
Daniel B.

55
La ventaja cuando se usa con frecuencia es que Counter calcula todos los recuentos UNA VEZ, que es casi tan rápido como hacer mystring.count ('a') una vez. Por lo tanto, si hace esto 20 veces, está ahorrando quizás 10 veces el tiempo de cálculo. El contador también puede decirle si un elemento está en la cadena: por ejemplo, si 'a' en el contador:
BAMF4bacon

51

¿Expresiones regulares tal vez?

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

30
Una buena idea, pero exagerada en este caso. El método de recuento 'contar' hace lo mismo con la ventaja adicional de ser inmediatamente obvio sobre lo que está haciendo.
nilamo

18
Por qué tasa negativa, tal vez alguien necesita este tipo de código para algo similar. my vote up
kiltek

12
Esto debería ser rechazado porque es la forma menos eficiente posible de contar caracteres en una cadena. Si el objetivo es simplemente contar caracteres, como indica la pregunta, sería difícil encontrar una peor manera de hacer el trabajo. En términos de memoria y sobrecarga del procesador, esta solución definitivamente se debe evitar. Nadie "necesitará" usar este método para encontrar el recuento de caracteres en una cadena.
Christopher

1
@kiltek De hecho, este pequeño fragmento me ha sido útil con una expresión regular un poco más compleja
Speccy

buena solución cuando los métodos de cadena no están disponibles:len(re.findall('1',bin(10)))
Conor


16

Python-3.x:

"aabc".count("a")

str.count (sub [, inicio [, fin]])

Devuelve el número de ocurrencias no superpuestas de subcadena sub en el rango [inicio, fin]. Los argumentos opcionales start y end se interpretan como en notación de corte.


13

str.count(a)es la mejor solución para contar un solo carácter en una cadena. Pero si necesita contar más caracteres, deberá leer la cadena completa tantas veces como desee.

Un mejor enfoque para este trabajo sería:

from collections import defaultdict

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

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

Entonces tendrá un dict que devuelve el número de apariciones de cada letra en la cadena y 0si no está presente.

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

Para un contador que no distingue entre mayúsculas y minúsculas, puede anular los métodos mutadores y de acceso subclasificando defaultdict(los de la clase base son de solo lectura):

class CICounter(defaultdict):
    def __getitem__(self, k):
        return super().__getitem__(k.lower())

    def __setitem__(self, k, v):
        super().__setitem__(k.lower(), v)


chars = CICounter(int)

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

>>>chars['a']
4
>>>chars['M']
2
>>>chars['x']
0

Básicamente estás reimplementando Counter, que ya es una clase collections.
merv

@merv En realidad no. Counteres una clase de Python puro y más hinchado defaultdict's __missing__está escrito en C . Para una tarea simple como esta ( inttambién se implementa en C), este enfoque es un poco más rápido.
Nuno André

11

Esta función fácil y directa podría ayudar:

def check_freq(x):
    freq = {}
    for c in x:
       freq[c] = str.count(c)
    return freq

check_freq("abbabcbdbabdbdbabababcbcbab")
{'a': 7, 'b': 14, 'c': 3, 'd': 3}

3
Estas sombras str. Si le da su nombre a la variable, strya no es un tipo incorporado. También estás contando catorce b's catorce veces. Puede evitar eso simplemente cambiando for c in textcon for c in set(text).
Nuno André

10

Las expresiones regulares son muy útiles si desea insensibilidad a mayúsculas y minúsculas (y, por supuesto, todo el poder de la expresión regular).

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 regex tarda diez veces más en ejecutarse, lo que probablemente será un problema solo si my_string es tremendamente largo o si el código está dentro de un bucle profundo.


1
Regex es excesivo si solo está tratando de corregir la sensibilidad a las mayúsculas y minúsculas. my_sting.lower (). count ('m') es más eficiente, más claro y más sucinto.
Ogre Codes

5
a = 'have a nice day'
symbol = 'abcdefghijklmnopqrstuvwxyz'
for key in symbol:
    print key, a.count(key)

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

2

Una forma alternativa de obtener todos los recuentos de caracteres sin usar Counter(), county regex

counts_dict = {}
for c in list(sentence):
  if c not in counts_dict:
    counts_dict[c] = 0
  counts_dict[c] += 1

for key, value in counts_dict.items():
    print(key, value)

1

countDefinitivamente es la forma más concisa y eficiente de contar la aparición de un carácter en una cadena, pero traté de encontrar una solución usando lambdaalgo como esto:

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

Esto resultará en:

4

Además, hay una ventaja más en esto: si la oración es una lista de subcadenas que contienen los mismos caracteres que arriba, entonces 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 resulta en:

4

Pero, por supuesto, esto solo funcionará cuando se verifique la aparición de un solo carácter, como 'a'en este caso particular.


0

Método "Sin usar el recuento para encontrar el carácter deseado en la cadena".

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

77
¿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

0

Soy fanático de la biblioteca de pandas, en particular del value_counts()método. Puede usarlo para contar la aparición de cada carácter en su cadena:

>>> import pandas as pd
>>> phrase = "I love the pandas library and its `value_counts()` method"
>>> pd.Series(list(phrase)).value_counts()
     8
a    5
e    4
t    4
o    3
n    3
s    3
d    3
l    3
u    2
i    2
r    2
v    2
`    2
h    2
p    1
b    1
I    1
m    1
(    1
y    1
_    1
)    1
c    1
dtype: int64

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

-1

Python 3

Hay dos formas de lograr esto:

1) Con función incorporada cuenta ()

sentence = 'Mary had a little lamb'
print(sentence.count('a'))`

2) Sin usar una función

sentence = 'Mary had a little lamb'    
count = 0

for i in sentence:
    if i == "a":
        count = count + 1

print(count)

-2

No más que este en mi humilde opinión: puede agregar los métodos superiores o inferiores

def count_letter_in_str(string,letter):
    return string.count(letter)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.