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, можно посчитать частоту слова уже среди слов.
Непересекающиеся вхождения
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 — он считает непересекающиеся вхождения. Поиск идёт слева направо, и после каждого совпадения продолжение начинается за концом найденного куска. Проверим на классике.
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))
1. Что вернёт выражение 'молоко'.count('о')?
2. Сколько вхождений найдёт 'аааа'.count('аа')?
3. Что вернёт count, если подстроки в строке нет?
4. Как посчитать количество слов в строке review?
5. Что означает второй аргумент в вызове s.count('о', 3)?
6. Как посчитать, сколько раз слово 'хлеб' встретилось среди слов строки note?
7. Что вернёт 'ааааа'.count('аа')?
8. Как посчитать, сколько слов в строке review?
9. Сколько букв «о» в слове «молоко»?
Дана строка журнала работы сервера. Выведи три числа, каждое на своей строке: сколько раз встретилось ERROR, сколько всего слов в журнале и сколько раз встретилось INFO.
Как посчитать количество подстроки в строке в 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-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Строки · Урок 14
Юникод: ord, chr и кодировки
Каждый символ — это число из таблицы Юникода. Учимся видеть строку глазами компьютера: ord и chr, байты через encode, и главная боль новичков — кракозябры из-за кодировок.
Строки · Урок 16
Выравнивание строк: ljust, rjust, center, zfill
ljust, rjust, center и zfill дотягивают строку до заданной ширины: ровные колонки прайса, заголовок по центру, номера заказов с ведущими нулями.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Словари · Урок 11
Counter: словарь, который считает сам
Counter из collections — словарь, который считает сам: слова строки, буквы слова, повторения в списке. most_common отдаёт самых частых, арифметика счётчиков сравнивает две выборки.
подсчёт слов в строке pythonпосчитать количество повторений python
Словари · Урок 20
Проект: частотный словарь текста
Финальный проект: частотный словарь текста — режем текст на слова, чистим, отбрасываем стоп-слова, считаем через Counter и выводим топ-5 ровными колонками.
подсчёт слов pythonпосчитать слова в тексте python
Строки · Урок 7
replace: замена подстрок
Заменить одно слово на другое во всём тексте, убрать мусор из середины строки, вычистить телефон до одних цифр — всё это делает один метод: replace.
python замена подстрокиpython заменить символ в строке