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

Фильтрация и накопление результата

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

В прошлом уроке мы считали элементы списка по условию и искали минимум с максимумом — цикл for и переменная-счётчик стали основным инструментом. Сейчас сделаем следующий шаг: вместо того чтобы только считать подходящие элементы, будем их собирать в отдельный список.

Паттерн фильтрации: отбор элементов в новый список

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

Паттерн строится из четырёх шагов:

  1. Создать пустой список для результата: result = []
  2. Перебрать исходный список циклом for
  3. Проверить каждый элемент через if
  4. Добавить подходящий элемент в результат: result.append(element)

Вот конкретный пример — отфильтруем из списка оценок только те, что выше 60:

def filter_passing(scores):
    result = []
    for score in scores:
        if score > 60:
            result.append(score)
    return result

print(filter_passing([45, 72, 58, 91, 63, 30]))
# [72, 91, 63]

Функция возвращает новый список — исходный scores остался нетронутым. Убедиться в этом просто: распечатайте scores после вызова, он будет тем же.

Ключевая деталь — инициализация result = [] перед циклом. Если написать её внутри цикла, список будет обнуляться на каждой итерации и в конце содержать максимум один элемент. Это одна из самых частых начальных ошибок при работе с накопительными паттернами.

Условие в if может быть любым: сравнение с числом, проверка типа, вхождение в диапазон. Паттерн от этого не меняется — меняется только сама проверка:

def filter_even(numbers):
    result = []
    for n in numbers:
        if n % 2 == 0:
            result.append(n)
    return result

print(filter_even([1, 2, 3, 4, 5, 6]))
# [2, 4, 6]

Обратите внимание: append() работает in-place — он изменяет result и ничего не возвращает. Поэтому result = result.append(n) — ошибка: переменная станет None. Вызов всегда выглядит как отдельная строка: result.append(n).

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