Подсчитать количество вхождений символа в строку


954

Какой самый простой способ подсчитать количество вхождений символа в строку?

например посчитать количество раз 'a'появляется в'Mary had a little lamb'

Ответы:


1332

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

Возвращает количество непересекающихся вхождений подстроки subв диапазоне [start, end]. Необязательные аргументы startи endинтерпретируются как в обозначении слайса.

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


112

Как и в других ответах, использование строкового метода count (), вероятно, является самым простым, но если вы делаете это часто, посмотрите на collection.Counter :

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

15
Почему это лучше, когда используется часто? В чем преимущество?
сетка

21
Если вы хотите подсчитать количество букв в заданной строке, Counter предоставит их все в более сжатой форме. Если вы хотите подсчитать одно письмо из множества разных строк, Counter не предоставляет никаких преимуществ.
Бренден Браун

2
Для этого конкретного экземпляра, считая символы, я бы предпочел collection.counter. Для поиска экземпляров определенной подстроки я бы использовал регулярное выражение или метод str.count (). Я не проверял, но может быть разница в производительности из-за небольших накладных расходов при подсчете всех символов и добавлении в словарь, а не при подсчете вхождений одной подстроки. Я бы предложил написать скрипт для генерации очень длинного файла для поиска, а затем определить время выполнения каждого метода.
Даниэль Б.

5
Преимущество при частом использовании заключается в том, что Counter рассчитывает все значения в ОДНО ВРЕМЯ, что почти так же быстро, как и mystring.count ('a') один раз. Таким образом, если вы сделаете это 20 раз, вы сэкономите, возможно, в 10 раз больше времени вычислений. Счетчик также может сказать вам, находится ли элемент в строке: например, если «счетчик» в счетчике:
BAMF4bacon

51

Регулярные выражения, может быть?

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

30
Прекрасная идея, но излишняя в этом случае. Строковый метод 'count' делает то же самое с дополнительным бонусом за то, что сразу становится очевидным, что он делает.
Ниламо

18
почему отрицательный показатель, может кому-то нужен такой код для чего-то похожего. мой голос вырос
килтек

12
Это должно быть опущено, потому что это наименее эффективный способ подсчета символов в строке. Если целью является просто подсчет символов, как показывает вопрос, было бы трудно найти худший способ выполнить работу. С точки зрения памяти и нагрузки на процессор, этого решения определенно следует избегать. Никто никогда не будет "нуждаться" в использовании этого метода, чтобы найти количество символов в строке.
Кристофер

1
@kiltek Действительно, этот маленький фрагмент кода был полезен для меня с регулярным выражением, немного более сложным
Speccy

хорошее решение, когда строковые методы недоступны:len(re.findall('1',bin(10)))
Конор


16

Python-3.x:

"aabc".count("a")

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

Возвращает количество неперекрывающихся вхождений подстроки sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются как обозначения срезов.


13

str.count(a)является лучшим решением для подсчета одного символа в строке. Но если вам нужно посчитать больше символов, вам придется читать всю строку столько раз, сколько символов вы хотите посчитать.

Лучшим подходом для этой работы будет:

from collections import defaultdict

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

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

Таким образом, у вас будет диктант, который возвращает количество вхождений каждой буквы в строке и, 0если ее нет.

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

Для счетчика, нечувствительного к регистру, вы можете переопределить методы мутатора и метода доступа, используя подклассы defaultdict(базовый класс только для чтения):

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

Вы в основном реализуете Counter, а это уже класс collections.
Merv

@merv Не совсем. Counterявляется более раздутым чистым классом Python и defaultdict«s __missing__будет написан на C . Для такой простой задачи, как эта ( intтакже реализована в C), этот подход немного быстрее.
Нуно Андре

11

Эта простая и понятная функция может помочь:

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
Вы затенение str. Если вы дадите имя переменной, она strбольше не является встроенным типом. Также вы считаете четырнадцать б четырнадцать раз. Вы можете избежать этого , просто изменив for c in textс for c in set(text).
Нуно Андре

10

Регулярные выражения очень полезны, если вы хотите не учитывать регистр (и, конечно, всю мощь регулярных выражений).

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

Имейте в виду, что версия регулярного выражения выполняется в десять раз дольше, что, вероятно, будет проблемой только в том случае, если my_string очень длинная или код находится в глубоком цикле.


1
Regex является излишним, если вы просто пытаетесь исправить чувствительность к регистру. my_sting.lower (). count ('m') более производительный, более понятный и лаконичный.
Огрские коды


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

Альтернативный способ получить все счетчики символов без использования Counter(), countи регулярное выражение

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это определенно самый краткий и эффективный способ подсчета появления символа в строке, но я попытался найти решение, используя lambdaчто-то вроде этого:

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

Это приведет к:

4

Кроме того, есть еще одно преимущество: если предложение представляет собой список подстрок, содержащих те же символы, что и выше, то это также дает правильный результат из-за использования in. Посмотри :

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

Это также приводит к:

4

Но, конечно, это будет работать только при проверке вхождения одного символа, как 'a'в данном конкретном случае.


0

Метод «Без использования счетчика, чтобы найти нужный символ в строке».

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
Почему пустая функция подсчета? Почему функция main ()? Почему уродливые пространства везде? Это НЕ хороший ответ.
bugmenot123

0

Я фанат библиотеки панд, в частности, value_counts()метод. Вы можете использовать его для подсчета появления каждого символа в вашей строке:

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

Есть два способа добиться этого:

1) Со встроенной функцией count ()

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

2) Без использования функции

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

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

print(count)

-2

Не более, чем это ИМХО - вы можете добавить верхний или нижний методы

def count_letter_in_str(string,letter):
    return string.count(letter)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.