Счетчики и фильтры в Python: как считать подходящие элементы
Автор: Казачкин Даниил Михайлович · Обновлено
Счётчик хранит количество событий, а фильтр определяет, какие элементы считаются подходящими. Переменная count начинается с нуля и увеличивается только внутри условной ветки. В отличие от накопителя суммы, к ней прибавляют единицу, а не само значение.
Подсчёт положительных чисел
numbers = [-3, 0, 5, 8, -1, 2]
count = 0
for number in numbers:
if number > 0:
count += 1
print('Положительных:', count)Ожидаемый вывод:
Положительных: 3Подходят 5, 8 и 2. Ноль не является положительным, потому что условие строгое. Если требуется считать неотрицательные числа, оператор меняется на >=.
Отступ определяет смысл
При count += 1 вне if счётчик увеличится для каждого элемента и станет равен длине списка. При инициализации внутри for он будет обнуляться. Проверьте вертикальное расположение строк перед поиском сложной ошибки.
Иногда одновременно нужны количество и сумма подходящих элементов. Используйте две переменные и обновляйте обе в одной ветке. Не вычисляйте среднее как total / count без проверки count > 0: если подходящих элементов нет, возникнет ZeroDivisionError.
Два фильтра для одной строки
Прочитайте строку и посчитайте отдельно количество цифр и количество пробелов, перебирая символы. Методы char.isdigit() и сравнение char == ' ' дают логические условия. Проверьте текст «Дом 12, этаж 3»: цифр 3, пробелов 3. Затем испытайте пустую строку. Для самопроверки временно печатайте символ только в той ветке, где счётчик меняется.
Проверка фильтра
Создайте список от -3 до 3 и для каждого элемента выведите две логические метки: положительный ли он и чётный ли. Затем посчитайте элементы, удовлетворяющие обоим условиям, и отдельно — хотя бы одному. До запуска предскажите два количества. Переставьте count += 1 на разные уровни отступа и используйте тест, чтобы увидеть изменение. Добавьте второй счётчик для отброшенных значений и проверьте равенство accepted + rejected == len(values). Такая контрольная сумма обнаруживает пропущенный путь и делает работу фильтра наблюдаемой.
Практикум: счётчики по нескольким признакам
Для последовательности чисел посчитайте положительные, чётные и одновременно положительные чётные. Используйте три отдельных счётчика и проверьте -2, -1, 0, 1, 2. До запуска заполните ожидаемую таблицу принадлежности. Обратите внимание: одно число может увеличить несколько счётчиков, поэтому здесь нужны независимые if, а не обязательно elif. Затем посчитайте долю подходящих среди всех элементов, обработав пустой список. Условие фильтра вынесите в именованную переменную для проверки.
Контрольная точка
Почему ноль увеличивает счётчик чётных, но не положительных? Вычислите оба признака независимо и объясните разницу между объединением and и отдельными категориями.
Частые вопросы
Счётчик и накопитель — одно и то же?
Оба обновляются в цикле, но счётчик обычно увеличивается на единицу при событии, а накопитель добавляет значение или иной вклад. Их начальное значение часто ноль, но смысл и инвариант различаются.