Как подсчитать количество элементов в Python: основные приёмы и примеры

Раздел: Python -> Работа с числами и коллекциями

Основные способы подсчета элементов в Python

Наиболее эффективный и универсальный способ получить количество элементов в Python - использовать встроенную функцию len(). Она работает со всеми типами коллекций: списками, кортежами, строками, словарями, множествами и другими, реализующими протокол __len__.


# Примеры использования len()
my_list = [10, 20, 30]
print(len(my_list))  # 3

my_string = "Привет"
print(len(my_string))  # 6 (кириллица занимает 2 байта, но len считает символы)

my_dict = {'a': 1, 'b': 2}
print(len(my_dict))  # 2 (количество ключей)

Python посчитать количество (посчитать количество элементов в python)

Частая ошибка:


try:
    print(len(42))  # TypeError: object of type 'int' has no len()
except TypeError as e:
    print(e)  # объект int нельзя передать в len()

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

Как посчитать количество вхождений конкретного элемента в список или строку?

Для подсчёта количества вхождений определённого значения используется метод count(), доступный у списков, кортежей и строк.


my_list = [1, 2, 2, 3, 2, 4]
print(my_list.count(2))  # 3

text = "Hello, world!"
print(text.count('o'))   # 2

Метод count() чувствителен к регистру. Для строк он ищет точное совпадение подстроки (не символы). Для списков - равенство через ==. Если элемент отсутствует, возвращается 0.

Как выполнить условный подсчёт элементов, соответствующих определённому критерию?

Когда требуется подсчитать элементы, удовлетворяющие условию, удобно использовать генераторное выражение в сочетании с sum(). Это эффективно по памяти.


numbers = [1, 5, 2, 8, 3, 10, 4]
# Подсчёт чётных чисел
count_even = sum(1 for n in numbers if n % 2 == 0)
print(count_even)  # 3 (2, 8, 4)

# Подсчёт чисел больше 5
count_big = sum(1 for n in numbers if n > 5)
print(count_big)   # 2 (8, 10)

Не следует путать с sum(1 for ...) и len([...]): первый вариант не создаёт промежуточный список, что экономит память. При работе с огромными наборами данных это критично.

Как подсчитать количество уникальных элементов в коллекции?

Чтобы определить число уникальных значений, удобно преобразовать коллекцию в множество и применить len().


items = [1, 2, 2, 3, 4, 3, 5]
unique_count = len(set(items))
print(unique_count)  # 5

Множество не сохраняет порядок и требует хешируемости элементов. Для вложенных списков или изменяемых объектов такой подход не сработает - потребуется преобразование в кортежи.

Как подсчитать частоту всех элементов списка (полный частотный анализ)?

Для построения словаря частот используется класс Counter из модуля collections. Он возвращает объект, похожий на словарь, где ключи - элементы, значения - их количество.


from collections import Counter

colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
counter = Counter(colors)
print(counter)
# Counter({'blue': 3, 'red': 2, 'green': 1})
print(counter['blue'])  # 3

Counter может неожиданно вернуть 0 для отсутствующего ключа (в отличие от обычного словаря, где будет KeyError). Это удобно, но иногда сбивает с толку. Также учитывайте, что Counter не сортирует по умолчанию.

Как подсчитать количество элементов в словаре по условию (по значению или ключу)?

Для условного подсчёта в словаре можно комбинировать метод items() и генератор.


scores = {'Anna': 85, 'Bob': 92, 'Charlie': 78, 'Diana': 92}
# Сколько человек имеют оценку 92?
count_92 = sum(1 for value in scores.values() if value == 92)
print(count_92)  # 2

# Сколько ключей начинаются на 'B'?
count_b = sum(1 for key in scores if key.startswith('B'))
print(count_b)   # 1 (Bob)

При многократном обращении к .values() или .keys() в цикле изменение словаря во время итерации приведёт к ошибке RuntimeError. Чтобы избежать, следует работать с копией или использовать list().

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

Генераторы не имеют длины. Чтобы узнать количество элементов, которые он выдаст, нужно преобразовать его в список (если память позволяет) или использовать встроенную функцию sum() с единицами.


gen = (x**2 for x in range(100))
# Первый способ: материализовать в список (осторожно, большие данные!)
count_list = len(list(gen))  # 100, но список занял память

# Второй способ: сумма единиц, не создавая список
gen = (x**2 for x in range(100))
count_gen = sum(1 for _ in gen)
print(count_gen)  # 100

После материализации генератора через list() он становится пустым. Повторное использование потребует нового генератора. Также len(list(...)) может вызвать MemoryError при очень больших последовательностях.

Как подсчитать количество элементов в многомерных структурах (вложенные списки)?

Для подсчёта всех элементов на всех уровнях вложенности требуется рекурсивный обход или использование itertools.chain.


import itertools

nested = [[1, 2], [3, [4, 5]], 6]
# Только первый уровень
count_level1 = len(nested)  # 3 (два списка и число 6)

# Все элементы, расплющив один уровень
flat = list(itertools.chain.from_iterable([x if isinstance(x, list) else [x] for x in nested]))
print(len(flat))  # 5 (1,2,3,[4,5],6) - не идеально, т.к. [4,5] остаётся списком

# Полное развёртывание через рекурсию
def deep_len(obj):
    if isinstance(obj, list):
        return sum(deep_len(item) for item in obj)
    return 1

print(deep_len(nested))  # 6 (1,2,3,4,5,6)

Рекурсивный подсчёт может привести к переполнению стека для глубокой вложенности. В таких случаях лучше использовать итеративный подход с явным стеком.

Расширенные примеры подсчёта элементов в Python

Подсчёт элементов с использованием filter() и lambda

Пример

numbers = [1, -2, 3, -4, 5, -6]
positive = list(filter(lambda x: x > 0, numbers))
print(len(positive))  # 3 (1,3,5)
# Альтернатива без создания списка:
count_positive = sum(1 for _ in filter(lambda x: x > 0, numbers))
print(count_positive)  # 3
3
3

Использование filter с lambda может быть медленнее генераторного выражения. Для простых условий предпочтительнее генератор.

Подсчёт вхождений подстрок в строке с перекрытиями

Пример

text = "ababa"
# Стандартный count не считает перекрывающиеся вхождения
print(text.count("aba"))  # 1 (только с позиции 0)

# Ручной перебор для перекрытий
def overlapping_count(s, sub):
    count = 0
    start = 0
    while True:
        pos = s.find(sub, start)
        if pos == -1:
            break
        count += 1
        start = pos + 1  # перекрытие: шаг +1 вместо +len(sub)
    return count

print(overlapping_count(text, "aba"))  # 2 (позиции 0 и 2)
1
2

Метод count() не поддерживает перекрывающиеся вхождения. Ручная реализация может быть медленной для больших строк.

Подсчёт элементов с помощью numpy (для числовых массивов)

Пример

import numpy as np

arr = np.array([1, 2, 2, 3, 4, 2, 5])
# Общее количество элементов
print(arr.size)  # 7

# Условный подсчёт (элементы > 2)
print(np.sum(arr > 2))  # 3 (3,4,5)

# Подсчёт вхождений каждого уникального значения
unique, counts = np.unique(arr, return_counts=True)
print(dict(zip(unique, counts)))  # {1:1, 2:3, 3:1, 4:1, 5:1}
7
3
{1:1, 2:3, 3:1, 4:1, 5:1}

numpy отлично подходит для больших числовых массивов, но он не является частью стандартной библиотеки Python. Для смешанных типов данных его применение ограничено.

Подсчёт элементов в итераторе без сохранения всего набора данных

Пример

# Предположим, у нас есть большой файл с числами
def read_numbers(filename):
    with open(filename) as f:
        for line in f:
            yield int(line.strip())

# Подсчитаем количество чисел, не загружая всё в память
count = 0
for _ in read_numbers('numbers.txt'):
    count += 1
print(count)  # Количество строк в файле

# Более элегантно с sum()
gen = read_numbers('numbers.txt')
count = sum(1 for _ in gen)
print(count)
(зависит от файла)

Генераторы одноразовые. После первого прохода итератор исчерпан. Для повторного подсчёта необходимо создать новый генератор.

Комбинированный подсчёт с использованием reduce()

Пример

from functools import reduce

numbers = [1, 2, 3, 4, 5]
# Подсчёт чётных чисел через reduce
count_even = reduce(lambda acc, x: acc + (1 if x % 2 == 0 else 0), numbers, 0)
print(count_even)  # 2
2

reduce() менее читаем для этой задачи, чем генераторное выражение, и обычно используется для более сложных свёрток.

Подсчёт количества True значений в логическом массиве

Пример

booleans = [True, False, True, True, False]
# Простой способ
print(sum(booleans))  # 3 (True == 1, False == 0)

# С list.count()
print(booleans.count(True))  # 3
3
3

При использовании sum() на списке с нечисловыми значениями, которые не поддерживают неявное преобразование в int, возникнет ошибка. Убедитесь, что элементы булевы или числа.

Подсчёт количества элементов в словаре с вложенными словарями

Пример

data = {
    'user1': {'name': 'Alice', 'age': 30},
    'user2': {'name': 'Bob', 'age': 25},
    'user3': {'name': 'Charlie'}
}
# Сколько пользователей имеют поле 'age'?
count_age = sum(1 for v in data.values() if 'age' in v)
print(count_age)  # 2
2

Подсчёт на основе вложенных структур требует точного знания схемы данных. Изменение структуры одного из вложенных словарей может привести к некорректным результатам.

Посчитать количество элементов в Python - comments

En
Python посчитать количество (python)