Policz liczbę wystąpień znaku w ciągu

953

Jaki jest najprostszy sposób policzenia liczby wystąpień znaku w ciągu?

np. policz, ile razy 'a'pojawia się w'Mary had a little lamb'

Mata
źródło

Odpowiedzi:

1331

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

Zwraca liczbę nie nakładających się wystąpień podłańcucha subw zakresie [start, end]. Opcjonalne argumenty starti endsą interpretowane jako w notacji plasterka.

>>> sentence = 'Mary had a little lamb'
>>> sentence.count('a')
4
Ogre Codes
źródło
147

Możesz użyć count () :

>>> 'Mary had a little lamb'.count('a')
4
zirytowany
źródło
112

Jak powiedziano w innych odpowiedziach, użycie metody string count () jest prawdopodobnie najprostsze, ale jeśli robisz to często, sprawdź kolekcje .

from collections import Counter
my_str = "Mary had a little lamb"
counter = Counter(my_str)
print counter['a']
Brenden Brown
źródło
15
Dlaczego jest to lepsze, gdy jest często używane? Jaka jest zaleta?
meshy
21
Jeśli chcesz, aby liczenie wielu liter w danym ciągu znaków, Counter zapewnia je wszystkie w bardziej zwięzłej formie. Jeśli chcesz liczyć na jedną literę z wielu różnych ciągów, Counter nie daje żadnych korzyści.
Brenden Brown,
2
W tym konkretnym przypadku, licząc znaki, wolałbym kolekcja.counter. Aby znaleźć instancje określonego podłańcucha, użyłbym wyrażenia regularnego lub metody str.count (). Nie testowałem, ale może występować różnica w wydajności z powodu niewielkiego narzutu w liczeniu wszystkich znaków i dołączaniu do słownika zamiast liczenia wystąpień pojedynczego podłańcucha. Sugerowałbym napisanie skryptu, aby wygenerować bardzo długi plik do przeszukania, a następnie wykonać czasowo wykonanie każdej metody.
Daniel B.
5
Zaletą, gdy jest często używany, jest to, że Counter oblicza wszystkie liczby JEDEN CZAS, co jest prawie tak szybkie, jak jednorazowe wykonanie mystring.count ('a'). Zatem jeśli zrobisz to 20 razy, zaoszczędzisz może 10 razy czas obliczeń. Licznik może również powiedzieć, czy element jest w ciągu: na przykład, jeśli „a” w liczniku:
BAMF4bacon
51

Może wyrażenia regularne?

import re
my_string = "Mary had a little lamb"
len(re.findall("a", my_string))
Sinan Taifour
źródło
30
Świetny pomysł, ale w tym przypadku przesada. Metoda strunowa „count” robi to samo z dodatkową korzyścią natychmiastowej oczywistości na temat tego, co robi.
nilamo,
18
dlaczego ujemna stopa, może ktoś potrzebuje tego rodzaju kodu do czegoś podobnego. mój głos w górę
kiltek
12
Należy to zanegować, ponieważ jest to najmniej efektywny sposób liczenia znaków w ciągu. Jeśli celem jest po prostu policzenie postaci, jak wskazuje pytanie, trudno byłoby znaleźć gorszy sposób wykonania pracy. Jeśli chodzi o pamięć i obciążenie procesora, zdecydowanie tego rozwiązania należy unikać. Nikt nigdy nie będzie „musiał” korzystać z tej metody, aby znaleźć liczbę znaków w ciągu.
Christopher
1
@kiltek Rzeczywiście, ten mały fragment był dla mnie przydatny z wyrażeniem regularnym nieco bardziej złożonym
Speccy
dobre rozwiązanie, gdy metody łańcuchowe nie są dostępne:len(re.findall('1',bin(10)))
Conor
27
myString.count('a');

więcej informacji tutaj

Finer Recliner
źródło
16

Python-3.x:

"aabc".count("a")

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

Zwraca liczbę nie nakładających się wystąpień podciągu w zakresie [początek, koniec]. Opcjonalne argumenty początkowy i końcowy są interpretowane jak w notacji plastra.

Aaron Fi
źródło
13

str.count(a)to najlepsze rozwiązanie, aby policzyć pojedynczy znak w ciągu. Ale jeśli chcesz policzyć więcej znaków, musisz przeczytać cały ciąg tyle razy, ile znaków chcesz policzyć.

Lepszym podejściem do tej pracy byłoby:

from collections import defaultdict

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

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

Otrzymasz więc dyktand, który zwraca liczbę wystąpień każdej litery w ciągu i 0jeśli nie jest obecny.

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

W przypadku licznika bez rozróżniania wielkości liter można zastąpić metody mutatora i akcesorium przez podklasowanie defaultdict( metody klasy podstawowej są tylko do odczytu):

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
Nuno André
źródło
Zasadniczo reimplementujesz Counter, co jest już klasą collections.
merv
@merv Nie bardzo. Counterjest bardziej nadęty czysta klasa Python i defaultdict„s __missing__jest napisany w C . W przypadku takiego prostego zadania ( intjest również zaimplementowane w C) takie podejście jest nieco szybsze.
Nuno André,
11

Ta łatwa i prosta funkcja może pomóc:

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}
Erick Mwazonga
źródło
3
Cieniujesz str. Jeśli podasz nazwę zmiennej, strnie jest to już typ wbudowany. Również czternaście razy czternaście. Możesz tego uniknąć, zmieniając za for c in textpomocą for c in set(text).
Nuno André
10

Wyrażenia regularne są bardzo przydatne, jeśli chcesz rozróżniać małe i wielkie litery (i oczywiście całą moc wyrażeń regularnych).

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

Należy pamiętać, że wersja wyrażenia regularnego uruchamia się dziesięć razy dłużej, co może stanowić problem tylko wtedy, gdy ciąg my_string jest niezwykle długi lub kod znajduje się w głębokiej pętli.

jafelds
źródło
1
Regex jest przesadą, jeśli tylko próbujesz naprawić rozróżnianie wielkości liter. my_sting.lower (). count ('m') jest bardziej wydajny, wyraźniejszy i bardziej zwięzły.
Ogre Codes,
5
a = 'have a nice day'
symbol = 'abcdefghijklmnopqrstuvwxyz'
for key in symbol:
    print key, a.count(key)
rekrut
źródło
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))
Thiru G.
źródło
2

Alternatywnym sposobem, aby uzyskać wszystkie liczby znaków bez używania Counter(), counta 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)
Syed Shamikh Shabbir
źródło
1

countjest zdecydowanie najbardziej zwięzłym i wydajnym sposobem liczenia występowania znaku w ciągu, ale próbowałem znaleźć rozwiązanie, używając lambdaczegoś takiego:

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

Spowoduje to:

4

Jest jeszcze jedna zaleta tego, że jeśli zdanie jest listą podłańcuchów zawierających te same znaki jak powyżej, to również daje poprawny wynik ze względu na użycie in. Spójrz :

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

Powoduje to również:

4

Ale oczywiście będzie to działać tylko podczas sprawdzania występowania pojedynczego znaku, na przykład 'a'w tym konkretnym przypadku.

Satish Garg
źródło
0

Metoda „Bez użycia licznika do znalezienia znaku w ciągu”.

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()
PRZEZ
źródło
7
Dlaczego funkcja pustego liczenia? Dlaczego funkcja main ()? Dlaczego wszędzie brzydkie miejsca? To NIE jest dobra odpowiedź.
bugmenot123,
0

Jestem fanem biblioteki pand, w szczególności value_counts()metody. Możesz go użyć do zliczenia występowania każdego znaku w ciągu:

>>> 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
Sébastien Więckowski
źródło
-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))
rekrut
źródło
-1

Python 3

Istnieją dwa sposoby na osiągnięcie tego:

1) Z wbudowaną funkcją count ()

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

2) Bez użycia funkcji

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

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

print(count)
Dipen Gajjar
źródło
-2

Nie więcej niż to IMHO - możesz dodać górną lub dolną metodę

def count_letter_in_str(string,letter):
    return string.count(letter)
Tim Seed
źródło