Алгоритмы обработки данных

Подсчёт и поиск минимума и максимума

Содержание курса

Цикл for по списку мы уже использовали для перебора элементов. Теперь идём дальше: добавляем внутрь цикла логику, которая позволяет не просто читать каждый элемент, а принимать решение — считать его или нет.

Ручной подсчёт элементов по условию: цикл и счётчик

Задача звучит просто: есть список чисел, надо узнать, сколько из них больше нуля. Или сколько строк в списке длиннее пяти символов. Или сколько оценок выше среднего. Во всех этих случаях нужен один и тот же паттерн.

Паттерн состоит из трёх шагов.

Первый — объявить счётчик до цикла и поставить его в ноль:

count = 0

Второй — пройтись по списку циклом for и внутри проверить условие:

scores = [45, 82, 60, 91, 33, 78]

count = 0
for score in scores:
    if score >= 70:
        count += 1

Третий — после цикла count содержит ответ:

print(count)  # 3

Здесь Python проходит по каждому элементу списка scores. На каждом шаге проверяет: score >= 70? Если да — увеличивает счётчик на единицу. Если нет — просто идёт дальше. В итоге в count накапливается количество элементов, прошедших проверку.

Почему count = 0 стоит именно до цикла, а не внутри? Потому что внутри цикла это присваивание выполнялось бы на каждой итерации, сбрасывая счётчик обратно в ноль. Результат всегда был бы 0 или 1 — в зависимости от последнего элемента.

Подсчёт можно усложнить без изменения структуры. Например, посчитать элементы, которые делятся на три:

numbers = [12, 7, 9, 4, 21, 5, 18]

count = 0
for n in numbers:
    if n % 3 == 0:
        count += 1

print(count)  # 4  (12, 9, 21, 18)

Или отфильтровать по двум условиям сразу — например, числа в диапазоне от 10 до 20:

count = 0
for n in numbers:
    if 10 <= n <= 20:
        count += 1

print(count)  # 2  (12, 18)

Структура всегда одна: инициализация → цикл → условие → инкремент. Условие можно менять как угодно, скелет остаётся тем же.

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