Метод count() в Python: как посчитать элементы в списке и строке

Метод count() в Python возвращает, сколько раз значение встречается в списке, строке или кортеже, а если значения нет, отдаёт 0.

В статье примеры с регистром и границами поиска в строке, отличие от len(), подсчёт всех значений через Counter, подсчёт по условию и пять частых ошибок с реальным выводом кода.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3156 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3810 экспертных мнений Подписаться на Телеграм-канал
Обложка: Метод count() в Python: как посчитать элементы в списке и строке

Метод count() в Python считает, сколько раз значение встречается в списке, строке или кортеже. Запись короткая: grades.count(5) вернёт число пятёрок в списке оценок, text.count("кот") вернёт число вхождений слова в строке. Если значения нет, метод вернёт 0 и не упадёт с ошибкой.

Сколько всего элементов в списке, count() не скажет: для этого есть функция len(). А если нужно посчитать каждое значение сразу, удобнее Counter из модуля collections. Ниже разберём все три случая на примерах. Как устроены сами списки, подробно описано в статье о списках в Python.

CheckroiCheckroiПодборка курсов по Python569 курсов • 52 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что делает 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.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

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 чисел с тысячей разных значений разница вышла в сотни раз. Точные цифры зависят от компьютера, но соотношение сохранится.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Подсчёт по условию, уникальные значения и слова

Метод 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
  1. Вызвали без аргумента или с двумя. У списка метод принимает ровно одно значение. Границы поиска работают только у строк и байтов, для списка сначала возьмите срез: nums[2:].count(1).
  2. Вызвали у словаря. Метода у словаря нет. Посчитать одинаковые значения можно так: list(d.values()).count(1).
  3. Искали число в строке. Строка ищет только строки. Решение: "123 123".count(str(123)).
  4. Получили меньше, чем ожидали. Проверьте регистр букв, лишние пробелы и знаки препинания. Для «aaaa» и «aa» вспомните про перекрытия.
  5. Программа долго считает частоты. Скорее всего, count() вызывается в цикле. Решение: один Counter вместо сотни вызовов.

Перехватывать такие ошибки, чтобы программа не падала, помогает конструкция try except.

Где освоить Python системно

Подсчёт элементов встречается почти в каждой учебной задаче: частота слов, повторы в списке, оценки в журнале. Потренироваться можно на 30 задачах по Python для начинающих.

Если нужен курс с наставником и проверкой домашних заданий, сравните курсы по Python в каталоге: там видны цена, длительность и формат у разных школ. Вот пять из них:

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 000 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 754 ₽4108 ₽/мес.9 месяцевОбзор курса
Профессия Python-разработчик
Перейти на сайт курса
SkillFactorySkillFactory140 040 ₽3890 ₽/мес.10 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что делает count в Python?

Метод count() возвращает, сколько раз значение встречается в списке, кортеже или строке: [5, 4, 5].count(5) даст 2. Если значения нет, вернётся 0, ошибки не будет.

Чем count() отличается от len()?

len() показывает, сколько всего элементов в списке или символов в строке. count() считает только элементы, равные заданному значению. Для списка [3, 8, 8] len() вернёт 3, а count(8) вернёт 2.

Как посчитать количество элементов в списке Python?

Общее число элементов возвращает функция len(a). Сколько раз встречается одно значение, покажет a.count(x). Частоту каждого значения сразу даёт Counter(a) из модуля collections.

Учитывает ли count() регистр букв?

Да. Для строки "Кот и кот" вызов count("кот") вернёт 1. Чтобы найти оба варианта, переведите текст в нижний регистр: text.lower().count("кот").

Почему count() находит меньше совпадений, чем я ожидал?

Метод считает вхождения без перекрытий, поэтому "aaaa".count("aa") вернёт 2, а не 3. Ещё частые причины: другой регистр, лишние пробелы и знаки препинания рядом со словом.

Можно ли посчитать элементы по условию через count()?

Нет, count() ищет только точное совпадение. Для условия подойдёт sum() с генератором: sum(n > 0 for n in nums) вернёт число положительных элементов.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!