Фильтрация элементов итератора с помощью bool-списка функции itertools.compress()

Опубликован: 22.06.2024 43

Довольно часто при работе с данными возникает потребность их отфильтровать по определенным критериям.

Для этого в Python имеется очень полезный и мощный инструмент - функция itertools.compress() встроенного модуля itertools.

По сути, itertools.compress() представляет собой эффективный фильтр, который пропускает только часть элементов исходной последовательности data, соответствующих другой последовательности из логических (булевых) значений selectors.

Функция itertools.compress() возвращает итератор и останавливается, когда исчерпана последовательность исходных данных data или selectors.

Синтаксис: itertools.compress(data, selectors)

  • data - итерируемый объект, который необходимо отфильтровать;
  • selectors - итерируемый объект с булевыми значениями (либо значениями 1, 0), который указывает, какие элементы следует пропустить (True, 1), а какие исключить (False, 0).

Примеры использования itertools.compress().

Фильтрация данных по условию.

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

import itertools  

# список оценок студентов 
grades = [52, 85, 90, 64, 69, 95, 78]

# сохраняем только оценки выше 70 
above_70 = [grade > 70 for grade in grades]

# используем функцию itertools.compress() 
high_grades = itertools.compress(grades, above_70)

print(list(high_grades))    
[85, 90, 95, 78]

В этом примере сначала создается список булевых значений (above_70), соответствующих условию "выше 70", а затем используем этот список в качестве селектора функции itertools.compress(), чтобы получить ожидаемый результат.

Использование itertools.compress() в комбинации с itertools.accumulate().

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

import itertools

# Исходный список данных о продажах
sales = [200, 120, 50, 250, 1500, 380, 60, 570]

# Создаем список селекторов о продажах больше 100
selectors = [x >= 100 for x in sales]

# Применяем функцию itertools.compress(), чтобы оставить только продажи, большие или равные 100 
filtered_sales = itertools.compress(sales, selectors)

# Применяем itertools.accumulate() для вычисления суммы продаж нарастающим итогом
result = itertools.accumulate(filtered_sales)

# Преобразуем итератор результата в список и выводим его
print(list(result))    
[200, 320, 570, 2070, 2450, 3020]

Похожие посты

Пропуск не нужных элементов последовательности с помощью itertools.dropwhile()

Возвращение элементов списка пока условие истинно с помощью itertools.takewhile()

Бесконечные итераторы в Python itertools.count(), cycle(), repeat()

Создание срезов из итератора с использованием itertools.islice()

Комментариев нет.