Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 15 из 20 Начальный 20 мин 120 XP

count: считаем вхождения в строке

count отвечает на вопрос «сколько?»: вхождений подстроки, символов в слове, слов в отзыве. Разбираем непересекающийся подсчёт, диапазон поиска и ловушку строки 'ааа'.

Редакция Питоники

В уроке 14 ты искал подстроку методом find и проверял её наличие через in. Поиск отвечает на вопрос «где?», но в реальных задачах чаще нужно «сколько»: сколько раз покупатель взял молоко, сколько ошибок в журнале, сколько слов в отзыве. За вопрос «сколько?» отвечает метод count — главный герой этого урока.

count: считаем вхождения подстроки

вхождения в строке заказа
order = 'молоко, хлеб, молоко, сыр, молоко'
print(order.count('молоко'))
print(order.count('хлеб'))
print(order.count('кефир'))
Вывод
3
1
0

Схема простая: s.count(подстрока) возвращает число — сколько раз подстрока встретилась в строке. Подстроки нет — вернётся 0, и это не ошибка, а нормальный ответ: ноль вхождений значит «не встречалась». Тот же метод работает и на списках: разобрав строку на слова через split из урока 9, можно посчитать частоту слова уже среди слов.

Непересекающиеся вхождения

count не замечает пересечений
print('ааа'.count('аа'))
print('аааа'.count('аа'))
print('ааааа'.count('аа'))
Вывод
1
2
2
пересекающиеся вхождения вручную
s = 'ааа'
n = 0
pos = s.find('аа')
while pos != -1:
    n += 1
    pos = s.find('аа', pos + 1)
print(n)
Вывод
2

Символы, диапазон и слова

Считать можно и одиночные символы — это самый частый случай. Два необязательных аргумента задают диапазон: s.count('о', 3) ищет только с индекса 3, третий аргумент ограничивает поиск справа. Для подсчёта слов строку сначала разбирают на слова через len(s.split()), а частоту конкретного слова считает count уже по списку слов.

символы, диапазон и частота слова
word = 'молоко'
print(word.count('о'))
print(word.count('о', 3))

order = 'молоко молоко хлеб сыр молоко'
words = order.split()
print(len(words))
print(words.count('молоко'))
Вывод
3
2
5
3

Метод count отвечает на вопрос «сколько?» одной строкой — без циклов и ручных счётчиков. Он не заменяет find из урока 14: find говорит, где подстрока, count — сколько её. А следующий урок покажет, как ровно расставить такие подсчёты по колонкам: ljust, rjust и zfill растянут строки до нужной ширины.

Как посчитать количество вхождений подстроки: count

count отвечает на вопрос «сколько?»: сколько раз товар встретился в заказе, сколько ошибок в журнале, сколько букв «о» в слове. Метод возвращает целое число, ничего не меняет и никогда не падает — если подстроки нет, ответ 0. Это делает его безопасным в условиях: результат можно сразу сравнивать с порогом, не проверяя «а нашлось ли вообще что-нибудь».

вхождения в строке заказа
order = 'молоко, хлеб, молоко, сыр, молоко'
print(order.count('молоко'))
print(order.count('хлеб'))
print(order.count('кефир'))
Вывод
3
1
0

Третья строка — важная: отсутствие подстроки даёт 0, а не ошибку. Многие методы строк ведут себя противоположно — например, find возвращает -1, и код, забывший про это, ломается. С count такой ошибки не бывает: ноль вхождений значит «не встречалась», и это законченный ответ.

Непересекающиеся вхождения

Главная особенность count — он считает непересекающиеся вхождения. Поиск идёт слева направо, и после каждого совпадения продолжение начинается за концом найденного куска. Проверим на классике.

count не замечает пересечений
print('ааа'.count('аа'))
print('аааа'.count('аа'))
print('ааааа'.count('аа'))
Вывод
1
2
2

Разбор по шагам: в строке 'ааа' пара 'аа' нашлась с индекса 0, и поиск продолжился с индекса 2, где осталась одна буква — поэтому ответ 1, а не 2. В 'аааа' пары нашлись с индексов 0 и 2 — ответ 2. В 'ааааа' то же самое: индексы 0 и 2, а пятая буква уже не даёт третьей пары, потому что для неё не хватает следующего символа.

пересекающиеся вхождения вручную
s = 'ааа'
n = 0
pos = s.find('аа')
while pos != -1:
    n += 1
    pos = s.find('аа', pos + 1)
print(n)
Вывод
2

Цикл работает, но писать его каждый раз лень. В реальном коде для подсчёта пересечений используют либо регулярное выражение с lookahead — len(re.findall('(?=(аа))', s)) — либо просто не задачу с пересечениями: в реальных данных «ааа» подряд почти не встречается, а вот «молоко, молоко» — постоянно.

Диапазон поиска: второй и третий аргументы

У count есть два необязательных аргумента, которые сужают область поиска. Второй — с какого индекса начинать, третий — до какого заканчивать. Это не «сколько вхождений искать», а границы диапазона, и путать эти два смысла опасно.

поиск в диапазоне
log = '2026-03-14 ERROR диск 2026-03-14 ERROR память'
print(log.count('ERROR'))
print(log.count('ERROR', 10))
print(log.count('ERROR', 10, 30))
Вывод
2
2
1

Третий вывод — самый полезный: между индексами 10 и 30 помещается только первое слово ERROR, второе начинается за тридцатым символом. Такая разбивка нужна, когда в строке смешаны разные типы записей и нужно посчитать что-то в одном куске, не затрагивая остальное.

Считаем слова: split и count

Подсчёт слов — самая частая задача, и тут count на строке не поможет: он ищет подстроку, а не слово. «молоко» в строке «молоковенный» тоже найдётся. Правильный приём — сначала разбить строку на слова, а потом считать уже среди слов.

символы, диапазон и частота слова
word = 'молоко'
print(word.count('о'))
print(word.count('о', 3))

order = 'молоко молоко хлеб сыр молоко'
words = order.split()
print(len(words))
print(words.count('молоко'))
Вывод
3
2
5
3

Разберём выводы. Первая строка — количество букв «о» в слове. Вторая — сколько из них начиная с третьего символа: в «молоко» буквы «о» стоят на позициях 3 и 5, и третья позиция — это как раз начало «о». Третья — количество слов в заказе: пять. Четвёртая — сколько раз среди слов встречается «молоко»: три. Заметьте, что четвёртая строка считает уже по списку, а не по строке, — и «молоковенный» таким способом посчитано не будет.

ЗадачаКак написатьЗамечание
Сколько раз слово в строкеs.count('слово')Найдёт и внутри других слов
Сколько раз слово среди словs.split().count('слово')Точный подсчёт по словам
Сколько слов всегоlen(s.split())split() отбрасывает пустые
Сколько символовs.count('о')Считает все вхождения буквы
Сколько в диапазонеs.count('x', start, end)Границы, а не количество
Пересекающиеся вхожденияцикл с find и сдвигом на 1Ручной обход строки

И последнее. count не понимает регулярные выражения: ищет он буквальную подстроку. Если нужно посчитать «сколько раз в строке встречается слово, начинающееся с Error», обычный count не поможет — тут нужен re.findall из курса регулярных выражений. Но в 90 процентах задач хватает простого count, и это хорошая новость: метод работает на C и не создаёт копий строки.

Считаем в логах и CSV: где count незаменим

Отдельный сюжет — подсчёт по журналу. Типичная задача: посчитать, сколько раз за ночь появилась ошибка определённого вида, и проверить, не превысила ли частота порог. Здесь count работает идеально, потому что нужен именно счётчик совпадений, а не список найденных мест.

частота ошибок за ночь
log = '2026-03-14 ERROR диск 2026-03-14 ERROR память'
errors = log.count('ERROR')
print('Ошибок за ночь:', errors)
if errors > 1:
    print('Нужно разбираться')
Вывод
Ошибок за ночь: 2
Нужно разбираться

Здесь count даёт то, ради чего его и используют: одно число вместо цикла со счётчиком. Код читается как условие, а не как алгоритм. Если бы совпадений было много и нужны были бы их позиции, count уже не подойдёт — тогда цикл с find, как мы разбирали в начале урока.

Для CSV то же самое с оговоркой: count по строке найдёт искомое и внутри других значений. Если файл устроен как «значение1;значение2;...» и нужно посчитать вхождения именно в первом поле, придётся разбирать построчно. Тот самый скелет из финального проекта: чистка, разбор, подсчёт.

И напоследок о скорости. count реализован на уровне C и работает за один проход по строке — на тексте в десятки мегабайт он отработает быстрее, чем Python-цикл с find в сто раз. Для логов, которые пишутся постоянно, эта разница превращается в разницу между «успеваем обрабатывать поток» и «не успеваем».

Частые ошибки при подсчёте

С подсчётом связаны две ошибки, которые встречаются чаще других. Первая — путаница между подстрокой и словом: s.count('молоко') найдёт «молоко» и внутри «молоковенный». Вторая — подстрока с разделителем: если искать «молоко,» вместо «молоко», одно из вхождений не посчитается, потому что после последнего слова запятой нет.

два варианта одной строки
order = 'молоко, хлеб, молоко'
print(order.count('молоко'))
print(order.count('молоко,'))
print('молоковенный'.count('молоко'))
Вывод
2
1
1

Первая строка даёт 2 — молока в заказе действительно два. Вторая даёт 1: после последнего «молоко» запятой нет, и оно не совпало. Третья показывает цену подстрочного поиска: «молоковенный» содержит «молоко» в начале, и count находит его, хотя речь шла о другом слове. Отсюда правило: если считаете СЛОВА — режьте на список и считайте по нему; если считаете ПОДСТРОКИ — помните, что разделитель часть искомого.

И третья ошибка, о которой стоит сказать отдельно, потому что она не про count, а про понимание задачи. «Сколько раз встречается слово» и «сколько слов в тексте» — это разные вопросы, хотя оба про подсчёт. Первый: s.split().count('слово'). Второй: len(s.split()). Перепутать их — значит ответить не на тот вопрос, и никакой count это не исправит.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

print('пераправа'.count('ра'))
print(len('два слова  три'.split()))
print('бабаба'.count('ба', 1))
Проверь себя
0 / 9

1. Что вернёт выражение 'молоко'.count('о')?

2. Сколько вхождений найдёт 'аааа'.count('аа')?

3. Что вернёт count, если подстроки в строке нет?

4. Как посчитать количество слов в строке review?

5. Что означает второй аргумент в вызове s.count('о', 3)?

6. Как посчитать, сколько раз слово 'хлеб' встретилось среди слов строки note?

7. Что вернёт 'ааааа'.count('аа')?

8. Как посчитать, сколько слов в строке review?

9. Сколько букв «о» в слове «молоко»?

Карточки терминов
Запомнено: 0 / 6
Практика

Дана строка журнала работы сервера. Выведи три числа, каждое на своей строке: сколько раз встретилось ERROR, сколько всего слов в журнале и сколько раз встретилось INFO.

practice.py
Вопросы и ответы по уроку

Как посчитать количество подстроки в строке в Python?

Методом count: строка.count(подстрока) возвращает число непересекающихся вхождений. Если подстроки нет, вернётся 0. Дополнительные аргументы start и end ограничивают диапазон поиска.

Урок 14: поиск подстрок find и in

Почему count не находит пересекающиеся вхождения?

count ведёт поиск слева направо и после каждого совпадения продолжает его за концом совпадения, поэтому 'ааа'.count('аа') даёт 1. Для пересекающихся вхождений пишут цикл с find, каждый раз сдвигая старт поиска на один символ вправо.

Как посчитать слова в строке?

Связкой len(s.split()): split() без аргументов разбивает строку по пробелам и отбрасывает лишние, а len возвращает длину списка слов. Частоту конкретного слова считает count по списку: s.split().count('слово').

Почему count не находит пересекающиеся вхождения?

count ведёт поиск слева направо и после каждого совпадения продолжает его за концом совпадения, поэтому 'ааа'.count('аа') даёт 1, а не 2. Для пересекающихся вхождений пишут цикл с find, каждый раз сдвигая старт поиска на один символ вправо.

Как посчитать количество слов в строке?

Связкой len(s.split()): split() без аргументов разбивает строку по пробелам и отбрасывает лишние, а len возвращает длину списка слов. Частоту конкретного слова считает count по списку: s.split().count('слово'). Помните, что count по строке найдёт подстроку и внутри других слов.

Урок 10: join

Чем count отличается от find?

find отвечает на вопрос «где» и возвращает индекс первого вхождения или -1, если подстроки нет. count отвечает на вопрос «сколько» и возвращает число вхождений, а при отсутствии — 0. Для проверки существования удобнее in — он не досматривает строку до конца.

Урок 8: поиск подстрок

Как посчитать частоту каждого слова в тексте?

Словарём-счётчиком: for w in s.split(): counts[w] = counts.get(w, 0) + 1. Так вы получите и количество каждого слова, и самый частый элемент — через max(counts, key=counts.get). Метод count годится только когда слово одно и известно заранее.

Понравился урок? Сошлитесь на него

«count ищет слева направо и после каждого совпадения продолжает поиск за его концом.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.