Cuente el número de apariciones de un carácter en una cadena

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

por ejemplo, cuente el número de veces 'a' aparece en 'Mary had a little lamb'

preguntado el 20 de julio de 09 a las 17:07

¿Cómo es posible que una pregunta tan simple haya obtenido 1023 votos? :-D -

21 Respuestas

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

Devuelve el número de apariciones no superpuestas de subcadena sub en el rango [start, end]. Argumentos opcionales start y end se interpretan como en notación de corte.

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

Respondido el 20 de junio de 20 a las 10:06

Puedes usar el contar() :

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

Respondido 05 Oct 16, 08:10

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

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

respondido 08 mar '19, 15:03

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

Si desea el recuento de muchas de las letras en una cadena determinada, Counter las proporciona 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 marrón

Para este caso particular, contando personajes, preferiría colecciones.contador. 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 apariciones de una sola subcadena. Sugeriría escribir un script para generar un archivo muy largo para buscar y luego cronometrar la ejecución de cada método. - Daniel B.

La ventaja cuando se usa con frecuencia es que Counter calcula todos los conteos 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: - Tocino

¿Expresiones regulares tal vez?

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

Respondido 20 Jul 09, 21:07

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

Por qué tasa negativa, tal vez alguien necesite este tipo de código para algo similar. mi voto a favor - falda escocesa

Esto debería ser votado en contra porque es la forma menos eficiente posible de contar caracteres en una cadena. Si el objetivo es simplemente contar personajes, como indica la pregunta, sería difícil encontrar una forma peor de hacer el trabajo. En términos de sobrecarga de memoria y procesador, esta solución definitivamente debe evitarse. Nadie "necesitará" utilizar este método para encontrar el número de caracteres en una cadena. - Christopher

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

myString.count('a');

más información aquí

Respondido 20 Jul 09, 21:07

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

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ás un dict que devuelve el número de ocurrencias de cada letra en la cadena y 0 si 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 de mutador y acceso mediante subclases 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

Respondido 22 Jul 18, 15:07

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

@merv En realidad, no. Counter es una clase Python pura más hinchada y defaultdict's __missing__ is escrito en C. Para una tarea simple como esta (int también se implementa en C) este enfoque es un poco más rápido. - nuno andré

También, trabaja para np.unique(sample, return_counts=True) podría ser útil. - TopCoder2000

Python-3.x:

"aabc".count("a")

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

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

Respondido el 14 de enero de 20 a las 19:01

Esta función sencilla y directa podría ayudar:

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

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

Si se desea una comprensión:

def check_freq(x):
    return {c: x.count(c) for c in set(x)}

Respondido 04 Feb 21, 17:02

Las expresiones regulares son muy útiles si desea que no se distinga entre mayúsculas y minúsculas (y, por supuesto, todo el poder de las 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 tarda diez veces más en ejecutarse, lo que probablemente será un problema solo si my_string es tremendamente larga o si el código está dentro de un bucle profundo.

Respondido el 05 de diciembre de 14 a las 17:12

Regex es excesivo si solo está tratando de corregir la distinción entre mayúsculas y minúsculas. my_sting.lower (). count ('m') es más eficaz, más claro y más conciso. - Códigos de Ogro

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

Respondido 24 Oct 15, 23:10

str = "count a character occurance"

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

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

Respondido 01 Abr '16, 03:04

Una forma alternativa de obtener todos los recuentos de caracteres sin usar Counter(), count y 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)

respondido 07 mar '19, 09:03

count es definitivamente 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 lambda, algo 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 de esto es que si la oración es una lista de subcadenas que contienen los mismos caracteres que la anterior, entonces también esto 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 ocurrencia de un solo carácter como 'a' en este caso particular.

respondido 28 mar '17, 18:03

Soy fanático de la biblioteca de pandas, en particular de la 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

Respondido el 19 de enero de 20 a las 09:01

Método "Sin usar el recuento para encontrar el carácter que desea 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()

Respondido 07 Feb 18, 22:02

¿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

No sé qué es lo 'más simple', pero la comprensión simple podría hacer:

>>> my_string = "Mary had a little lamb"
>>> sum(char == 'a' for char in my_string)
4

Aprovechando la suma incorporada, la comprensión del generador y el hecho de que bool es una subclase de un entero: ¿cuántas veces el carácter es igual a 'a'.

Respondido el 20 de Septiembre de 20 a las 09:09

a = "I walked today,"
c=['d','e','f']
count=0
for i in a:
    if str(i) in c:
        count+=1

print(count)

Respondido el 29 de Septiembre de 20 a las 04:09

Esto no diferencia los recuentos de d, e, f. - Gino Mempín

Hola @GinoMempin, no creo que la intención aquí sea diferenciar, sin embargo, puede declarar otras dos variables y comparar i con 'd', 'e' y 'f' por separado si lo desea. - Kquek

Sé que el pedido es contar una letra en particular. Estoy escribiendo aquí código genérico sin usar ningún método.

sentence1 =" Mary had a little lamb"
count = {}
for i in sentence1:
    if i in count:
        count[i.lower()] = count[i.lower()] + 1
    else:
        count[i.lower()] = 1
print(count)

salida

{' ': 5, 'm': 2, 'a': 4, 'r': 1, 'y': 1, 'h': 1, 'd': 1, 'l': 3, 'i': 1, 't': 2, 'e': 1, 'b': 1}

Ahora, si desea una frecuencia de letra en particular, puede imprimir como se muestra a continuación.

print(count['m'])
2

Respondido 03 Feb 21, 15:02

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

respondido 15 nov., 15:19

3 Python

Hay dos formas de lograrlo:

1) Con función de recuento incorporada ()

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

2) Sin utilizar una función

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

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

print(count)

Respondido el 07 de Septiembre de 19 a las 21:09

No más que esto en mi humilde opinión: puede agregar los métodos superior o inferior

def count_letter_in_str(string,letter):
    return string.count(letter)

Respondido 23 Feb 16, 19:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.