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


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.