Contar as ocorrências numéricas de um caractere em uma sequência


954

Qual é a maneira mais simples de contar o número de ocorrências de um caractere em uma string?

por exemplo, conte o número de vezes que 'a'aparece'Mary had a little lamb'

Respostas:


1332

str.count (sub [, início [, fim]])

Retorne o número de ocorrências não sobrepostas de substring subno intervalo [start, end]. Argumentos opcionais starte endsão interpretados como na notação de fatia.

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


112

Como outras respostas disseram, usar o método string (count) é provavelmente o mais simples, mas se você estiver fazendo isso com frequência, confira as coleções .

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

15
Por que isso é melhor quando usado com freqüência? Qual a vantagem?
meshy 10/02

21
Se você deseja a contagem de muitas letras em uma determinada sequência, o Counter fornece todas elas de forma mais sucinta. Se você deseja a contagem de uma letra de várias seqüências diferentes, o Counter não oferece nenhum benefício.
Brenden Brown

2
Para esta instância em particular, contando caracteres, eu preferiria collections.counter. Para encontrar instâncias de uma substring específica, eu usaria uma expressão regular ou o método str.count (). Não testei, mas pode haver uma diferença de desempenho devido a uma pequena sobrecarga na contagem de todos os caracteres e no anexo de um dicionário, em vez de contar ocorrências de uma única substring. Eu sugeriria escrever um script para gerar um arquivo muito longo para pesquisar e cronometrar a execução de cada método.
Daniel B.

5
A vantagem, quando usada com freqüência, é que o Counter calcula todas as contagens UMA VEZ, o que é quase tão rápido quanto executar mystring.count ('a') uma vez. Assim, se você fizer isso 20 vezes, estará economizando talvez 10 vezes o tempo de computação. O contador também pode dizer se um item está na sequência: por exemplo, se 'a' no contador:
BAMF4bacon

51

Expressões regulares, talvez?

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

30
Uma ótima idéia, mas exagero neste caso. O método de string 'count' faz a mesma coisa com o bônus adicional de ser imediatamente óbvio sobre o que está fazendo.
Nilamo

18
por que taxa negativa, talvez alguém precise desse tipo de código para algo semelhante. meu voto para cima
kiltek 31/03/12

12
Isso deve ser diminuído, porque é a maneira menos eficiente possível de contar caracteres em uma string. Se o objetivo é simplesmente contar caracteres, como a pergunta indica, seria difícil encontrar uma maneira pior de fazer o trabalho. Em termos de sobrecarga de memória e processador, essa solução definitivamente deve ser evitada. Ninguém nunca "precisará" usar esse método para encontrar a contagem de caracteres em uma string.
21413 Christopher

1
@kiltek Na verdade, este pequeno trecho tem sido útil para mim com uma expressão regular um pouco mais complexa
Speccy

boa solução quando os métodos de string não estão disponíveis:len(re.findall('1',bin(10)))
Conor


16

Python-3.x:

"aabc".count("a")

str.count (sub [, início [, fim]])

Retorne o número de ocorrências não sobrepostas da subcadeia de substring no intervalo [start, end]. Os argumentos opcionais start e end são interpretados como na notação de fatia.


13

str.count(a)é a melhor solução para contar um único caractere em uma string. Mas se você precisar contar mais caracteres, terá que ler a sequência inteira quantas vezes quiser.

Uma abordagem melhor para este trabalho seria:

from collections import defaultdict

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

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

Portanto, você terá um ditado que retorna o número de ocorrências de todas as letras da string e, 0se não estiver presente.

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

Para um contador que não diferencia maiúsculas de minúsculas, você pode substituir os métodos mutador e acessador subclassificando defaultdict(os da classe base são somente leitura):

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

Você está basicamente reimplementando Counter, o que já é uma classe collections.
merv

@merv Na verdade não. Counteré uma classe Python puro mais inchado e defaultdict's __missing__é escrita em C . Para uma tarefa simples como esta ( inttambém é implementada em C), essa abordagem é levemente mais rápida.
Nuno André

11

Essa função fácil e direta pode ajudar:

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
Você está sombreando str. Se você der seu nome à variável, strnão será mais um tipo interno. Além disso, você está contando catorze vezes c de c 14. Você pode evitar isso simplesmente mudando for c in textcom for c in set(text).
Nuno André

10

Expressões regulares são muito úteis se você deseja fazer distinção entre maiúsculas e minúsculas (e, claro, todo o poder do 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))

Esteja ciente de que a versão regex demora dez vezes mais tempo para ser executada, o que provavelmente será um problema apenas se my_string for tremendamente longo ou se o código estiver dentro de um loop profundo.


1
O Regex é um exagero se você estiver apenas tentando corrigir a distinção entre maiúsculas e minúsculas. my_sting.lower (). count ('m') é mais eficiente, mais claro e mais sucinto.
Códigos Ogre

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

Uma forma alternativa de obter todas as contagens de caracteres sem usar Counter(), counte 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

counté definitivamente a maneira mais concisa e eficiente de contar a ocorrência de um caractere em uma string, mas tentei encontrar uma solução usando lambda, algo como isto:

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

Isso resultará em:

4

Além disso, há mais uma vantagem disso: se a sentença for uma lista de sub-strings contendo os mesmos caracteres que acima, isso também fornecerá o resultado correto devido ao uso de in. Dar uma olhada :

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

Isso também resulta em:

4

Mas é claro que isso funcionará apenas ao verificar a ocorrência de um único caractere, como 'a'neste caso em particular.


0

"Sem usar count para encontrar o caractere em string".

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

7
Por que a contagem vazia funciona? Por que a função main ()? Por que os espaços feios em todo lugar? Esta não é uma boa resposta.
bugmenot123

0

Sou fã da biblioteca de pandas, em particular o value_counts()método. Você pode usá-lo para contar a ocorrência de cada caractere na sua string:

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

Existem duas maneiras de conseguir isso:

1) Com contagem de funções incorporada ()

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

2) Sem usar uma função

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

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

print(count)

-2

Não mais do que este IMHO - você pode adicionar os métodos superior ou inferior

def count_letter_in_str(string,letter):
    return string.count(letter)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.