Опубликован: 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()
Комментариев нет.