Метод count() в Python считает, сколько раз значение встречается в списке, строке или кортеже. Запись короткая: grades.count(5) вернёт число пятёрок в списке оценок, text.count("кот") вернёт число вхождений слова в строке. Если значения нет, метод вернёт 0 и не упадёт с ошибкой.
Сколько всего элементов в списке, count() не скажет: для этого есть функция len(). А если нужно посчитать каждое значение сразу, удобнее Counter из модуля collections. Ниже разберём все три случая на примерах. Как устроены сами списки, подробно описано в статье о списках в Python.
Что делает count() и как его вызвать

У count() две формы. Для списков, кортежей и range метод принимает ровно одно значение. Для строк и байтов можно добавить начало и конец участка, где искать.
| Тип данных | Вызов | Что считает |
|---|---|---|
список list |
a.count(x) |
элементы, равные x |
кортеж tuple |
t.count(x) |
элементы, равные x |
range |
r.count(x) |
есть ли число в диапазоне (0 или 1) |
строка str |
s.count(sub, start, end) |
вхождения подстроки без перекрытий |
байты bytes |
b.count(sub, start, end) |
вхождения последовательности байтов |
В документации Python метод последовательностей описан одной строкой: он возвращает общее число вхождений значения. Вот как это выглядит на списке оценок:
grades = [5, 4, 5, 3, 5, 4]
print(grades.count(5))
print(grades.count(2))
Результат:
3
0
Пятёрок три, двоек нет, поэтому второй вызов дал 0. Исходный список метод не меняет.
count() для строк
У строки count() ищет подстроку: один символ, слово или любой кусок текста. Регистр букв имеет значение, «Кот» и «кот» для Python разные строки.
text = "Кот ловит мышь, кот спит"
print(text.count("кот"))
print(text.lower().count("кот"))
print(text.count("о"))
Результат:
1
2
3
Первый вызов нашёл только «кот» со строчной буквы. Чтобы учесть оба варианта, сначала переведите текст в нижний регистр через lower(). Остальные методы, которые часто стоят рядом с count(), собраны в шпаргалке по методам строк.
Как искать только в части строки
Второй и третий аргументы задают участок поиска. Они работают как границы среза: начало входит, конец нет.
s = "abracadabra"
print(s.count("a"))
print(s.count("a", 4))
print(s.count("a", 4, 8))
print(s.count(""))
Результат:
5
3
2
12
Последняя строка выглядит странно, но так задумано. Пустую подстроку Python находит между каждой парой символов и по краям, поэтому выходит длина строки плюс один: 11 + 1 = 12.
Перекрывающиеся вхождения
Метод считает вхождения без перекрытий: найдя совпадение, он продолжает поиск после его конца. В строке «aaaa» подстрока «aa» помещается трижды, если сдвигаться на один символ, но count() вернёт 2.
print("aaaa".count("aa"))
import re
print(len(re.findall(r"(?=aa)", "aaaa")))
Результат:
2
3
Если перекрытия нужны (например, при поиске мотива в последовательности ДНК), выручит опережающая проверка (?=...) из модуля re. Как она устроена, рассказываем в материале про регулярные выражения в Python.
count() у кортежей, байтов и range
Кортеж ведёт себя как список, байты как строка. У range метод тоже есть, хотя пользуются им редко: число в диапазоне либо есть, либо нет.
point = (1, 0, 1, 1)
print(point.count(1))
data = b"GET / HTTP/1.1\r\nHost: x\r\n\r\n"
print(data.count(b"\r\n"))
print(range(0, 100, 5).count(35))
Результат:
3
3
1
У словаря и множества метода count() нет. В словаре каждый ключ встречается один раз, а во множестве повторов не бывает вообще.
Как count() сравнивает элементы
Метод сравнивает элементы через ==. Отсюда два неочевидных следствия.
- Числа 1, 1.0 и True равны между собой, поэтому
count(1)посчитает их все. Строка"1"числу не равна. - Вложенный список сравнивается целиком. Метод видит только элементы верхнего уровня и не заглядывает внутрь.
items = [1, 1.0, True, "1"]
print(items.count(1))
rows = [[1, 2], [1, 2], [2, 1]]
print(rows.count([1, 2]))
print(rows.count(1))
Результат:
3
2
0
В списке rows единица встречается три раза, но count(1) вернул 0: на верхнем уровне там лежат списки, а не числа. Как посчитать элементы внутри, показано ниже.
count() или len(): сколько всего элементов в списке
Частый запрос «количество элементов в списке Python» обычно про len(), а не про count(). Функция len() возвращает длину списка, метод count() отвечает на вопрос, сколько в нём конкретного значения.
nums = [3, 8, 1, 9, 4]
print(len(nums))
print(nums.count(8))
Результат:
5
1
Чтобы не путаться, сверяйтесь с короткой таблицей:
| Задача | Чем решать |
|---|---|
| сколько элементов в списке | len(a) |
| сколько раз встречается одно значение | a.count(x) |
| сколько раз встречается каждое значение | Counter(a) |
| сколько элементов подходят под условие | sum(1 for x in a if …) |
| сколько разных значений | len(set(a)) |
Как посчитать все значения сразу через Counter

Когда нужно узнать частоту каждого значения, вызывать count() по очереди неудобно и медленно. Для этого в стандартной библиотеке есть Counter. По документации модуля collections, это подкласс словаря: элементы лежат в ключах, а их количества в значениях.
from collections import Counter
words = "красный синий красный зелёный синий красный".split()
c = Counter(words)
print(c)
print(c["красный"])
print(c["жёлтый"])
print(c.most_common(2))
Результат:
Counter({'красный': 3, 'синий': 2, 'зелёный': 1})
3
0
[('красный', 3), ('синий', 2)]
На отсутствующий ключ Counter возвращает 0, а обычный словарь в такой ситуации выдал бы KeyError (как его обойти, мы разбирали в статье про метод get()). Метод most_common(n) отдаёт n самых частых значений от большего к меньшему.
Почему count() в цикле тормозит
Каждый вызов count() проходит весь список от начала до конца. Если вызывать его для каждого уникального значения, список прочитается сотни раз. Counter проходит его один раз.
import timeit
setup = "import random; from collections import Counter; data = [random.randint(0, 999) for _ in range(10_000)]"
slow = "{x: data.count(x) for x in set(data)}"
fast = "Counter(data)"
print(round(timeit.timeit(slow, setup, number=5) / 5, 3))
print(round(timeit.timeit(fast, setup, number=5) / 5, 4))
Результат (секунды на один прогон):
0.076
0.0002
На списке из 10 000 чисел с тысячей разных значений разница вышла в сотни раз. Точные цифры зависят от компьютера, но соотношение сохранится.
Подсчёт по условию, уникальные значения и слова
Метод count() ищет только точное совпадение. Для остальных задач подсчёта хватает пары строк без него.
Сколько элементов подходят под условие
Сколько в списке положительных чисел, count() не ответит: ему нужно конкретное значение. Помогает sum() с выражением-генератором.
nums = [12, -3, 7, 0, -8, 15, 4]
print(sum(1 for n in nums if n > 0))
print(sum(n > 0 for n in nums))
Результат:
4
4
Второй вариант короче. Он работает, потому что True при сложении считается за 1, а False за 0. Другие приёмы с этой функцией собраны в инструкции, как суммировать список в Python.
Сколько разных значений и какие повторяются
nums = [4, 2, 4, 7, 2, 4]
print(len(set(nums)))
print(len(nums) - len(set(nums)))
print([x for x in set(nums) if nums.count(x) > 1])
Результат:
3
3
[2, 4]
Множество убирает повторы, поэтому его длина равна числу разных значений. Разница с длиной списка показывает, сколько лишних копий в нём лежит.
Сколько слов в тексте
Строку сначала режут на слова методом split(), затем считают длину списка или вхождения нужного слова. Другие способы разбить текст есть в статье, как преобразовать строку в список.
phrase = "Учиться никогда не поздно, учиться полезно"
print(len(phrase.split()))
print(phrase.lower().split().count("учиться"))
Результат:
6
2
Обратите внимание: split() оставляет знаки препинания внутри слов. «поздно,» с запятой и «поздно» без неё не совпадут, поэтому перед подсчётом конкретного слова запятые и точки лучше убрать.
Элементы во вложенных списках
nested = [[1, 2, 1], [1], [3, 1]]
print(sum(row.count(1) for row in nested))
Результат:
4
Здесь count() вызывается для каждого внутреннего списка, а sum() складывает ответы.
Другие count, которые путают с методом списка
Слово count в Python встречается ещё в нескольких местах, и делают они совсем другое.
itertools.count()ничего не считает, это бесконечный счётчик. По документации itertools, он создаёт итератор, который отдаёт числа с равным шагом начиная соstart.DataFrame.count()в pandas возвращает число непустых ячеек в каждом столбце, а не число повторов. Пустыми считаютсяNone,NaN,NaTиpandas.NA(справка pandas).COUNTв SQL считает строки в таблице базы данных. Это функция другого языка, подробнее в статье про COUNT в SQL.
Так выглядит itertools.count() на практике:
from itertools import count
for i in count(10, 5):
if i > 25:
break
print(i)
Результат:
10
15
20
25
Без условия выхода такой цикл не закончится никогда, поэтому break здесь обязателен.
Частые ошибки и что с ними делать

Пять ошибок встречаются чаще других. Код ниже вызывает четыре из них, пятая (медленный подсчёт) разобрана выше.
nums = [1, 2, 3]
try:
nums.count()
except TypeError as e:
print(e)
try:
nums.count(1, 2)
except TypeError as e:
print(e)
d = {"a": 1, "b": 1}
try:
d.count(1)
except AttributeError as e:
print(e)
print(list(d.values()).count(1))
try:
"123 123".count(123)
except TypeError as e:
print(e)
Результат:
list.count() takes exactly one argument (0 given)
list.count() takes exactly one argument (2 given)
'dict' object has no attribute 'count'
2
count() argument 1 must be str, not int
- Вызвали без аргумента или с двумя. У списка метод принимает ровно одно значение. Границы поиска работают только у строк и байтов, для списка сначала возьмите срез:
nums[2:].count(1). - Вызвали у словаря. Метода у словаря нет. Посчитать одинаковые значения можно так:
list(d.values()).count(1). - Искали число в строке. Строка ищет только строки. Решение:
"123 123".count(str(123)). - Получили меньше, чем ожидали. Проверьте регистр букв, лишние пробелы и знаки препинания. Для «aaaa» и «aa» вспомните про перекрытия.
- Программа долго считает частоты. Скорее всего,
count()вызывается в цикле. Решение: одинCounterвместо сотни вызовов.
Перехватывать такие ошибки, чтобы программа не падала, помогает конструкция try except.
Где освоить Python системно
Подсчёт элементов встречается почти в каждой учебной задаче: частота слов, повторы в списке, оценки в журнале. Потренироваться можно на 30 задачах по Python для начинающих.
Если нужен курс с наставником и проверкой домашних заданий, сравните курсы по Python в каталоге: там видны цена, длительность и формат у разных школ. Вот пять из них:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 000 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 754 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Профессия Python-разработчик Перейти на сайт курса | 140 040 ₽ | 3890 ₽/мес. | 10 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




