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


953

Який найпростіший спосіб підрахувати кількість входів символу в рядку?

наприклад, порахуйте кількість разів 'a', у яких з'являється'Mary had a little lamb'

Відповіді:


1331

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

Повертає кількість subдіапазонів, що не збігаються між собою, в діапазоні [start, end]. Необов’язкові аргументи startта endінтерпретуються як у фрагментах.

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


112

Як сказано в інших відповідях, використання рядкового методу count (), мабуть, найпростіший, але якщо ви робите це часто, перегляньте колекції.Counter :

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

15
Чому це краще, коли використовується часто? Яка перевага?
meshy

21
Якщо ви хочете відлічити багато букв у заданому рядку, Counter надає їх усім у більш лаконічній формі. Якщо ви хочете рахувати одну букву з безлічі різних рядків, Counter не приносить користі.
Бренден Браун

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

5
Перевага при частому використанні полягає в тому, що лічильник обчислює всі підрахунки ОДИН ЧАС, що майже так само швидко, як одноразово робити mystring.count ('a'). Таким чином, якщо ви зробите це 20 разів, ви економите, можливо, в 10 разів час обчислення. Лічильник також може сказати вам, чи є елемент у рядку: наприклад, якщо "a" у лічильнику:
BAMF4bacon

51

Можливо, регулярні вирази?

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

30
Чудова ідея, але в цьому випадку надмірність. Метод рядків 'count' робить те саме, що додається бонус, що відразу зрозуміло, що він робить.
nilamo

18
чому негативна ставка, можливо, комусь потрібен такий код для чогось подібного. мій голос вгору
kiltek

12
Це слід обмежувати, оскільки це найменш ефективний спосіб підрахунку символів у рядку. Якщо мета - просто порахувати символів, як вказує питання, важко було б знайти гірший спосіб виконати роботу. Що стосується пам'яті та витрат на процесор, цього рішення, безумовно, слід уникати. Нікому ніколи не знадобиться використовувати цей метод, щоб знайти кількість символів у рядку.
Крістофер

1
@kiltek Дійсно, цей маленький фрагмент був корисний мені з регулярним виразом трохи складнішим
Speccy

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


16

Python-3.x:

"aabc".count("a")

str.count (sub [, 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«и __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це вже не вбудований тип. Також ви рахуєте чотирнадцять b чотирнадцять разів. Ви можете уникнути цього , просто змінивши 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
Чому функція підрахунку порожніх? Чому основна () функція? Чому всюди потворні простори? Це НЕ хороша відповідь.
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

Пітон 3

Це два способи досягти цього:

1) З вбудованим числом функцій ()

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.