Как посчитать количество вхождений элемента в список Python?
Надо узнать, сколько раз конкретное значение встречается в списке. И ещё хотелось бы сразу посчитать, сколько раз встречается каждый элемент. Как посчитать количество вхождений в Python без ручного цикла со счётчиком?
2 ответа
Для одного значения есть готовый метод .count():
nums = [1, 2, 2, 3, 2]
print(nums.count(2)) # 3
Работает и для строк ('banana'.count('a') → 3), и для списков.
Если нужно посчитать сразу все элементы, не вызывайте .count() в цикле (это медленно, O(n²)). Возьмите Counter из модуля collections:
from collections import Counter
nums = [1, 2, 2, 3, 2, 1]
counts = Counter(nums)
print(counts) # Counter({2: 3, 1: 2, 3: 1})
print(counts[2]) # 3
print(counts.most_common(2)) # [(2, 3), (1, 2)]
Counter — это словарь, где ключ это элемент, а значение это количество. most_common(n) сразу выдаёт топ-N самых частых.
Частая ошибка — для подсчёта всех элементов писать {x: nums.count(x) for x in nums}. Оно работает, но проходит список заново для каждого элемента и тормозит на больших данных. Counter делает то же за один проход.
Ещё плюс Counter: обращение к несуществующему ключу даёт 0, а не KeyError, так что проверять наличие не нужно.
Без импортов то же можно сделать через dict.get:
counts = {}
for x in nums:
counts[x] = counts.get(x, 0) + 1
get(x, 0) возвращает текущий счётчик или 0, если ключа ещё нет — поэтому не падает на первом появлении. Это ровно то, что делает Counter под капотом. Удобно, когда не хочется тянуть collections, но Counter всё-таки короче и понятнее.