Перейти к основному содержимому

Фильтрация коллекции

Фильтрация — это отбор тех элементов коллекции, которые соответствуют условию.

Условие принимает один элемент и отвечает True (оставить его) или False (пропустить его). Функция, которая это делает, называется предикатом.

Фильтрация создаёт новый список. Исходный список не изменяется.

В Python фильтруют с помощью спискового включения с частью if: [w for w in words if len(w) > 3]. Оно читается почти как обычная фраза на английском: оставить каждое w, длина которого больше 3.

В Python также есть встроенная функция filter(), которая принимает предикат и список. Она работает, но возвращает ленивый итератор и требует lambda даже для простого условия, поэтому списковое включение обычно понятнее. На этой странице используются включения.


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

Самый простой способ фильтрации — включение, в части if которого находится условие. Python проходит по списку и оставляет каждый элемент, который проходит проверку.

Словари работают так же: словарное включение по items() копирует подходящие пары ключ:значение в новый словарь.

Если условию нужна ещё и позиция элемента, enumerate даёт индекс и значение вместе.

Чтобы оставить элементы, которые не соответствуют условию, поставьте not перед условием. Отдельной функции filter_not в Python нет.

Список может содержать значения разных типов. isinstance(v, str) проверяет, является ли значение строкой. Значение также может быть None, что означает «нет значения»; чтобы пропустить такие элементы, используйте сравнение is not None.

Фильтрация списка

Оставьте только слова длиннее 3 букв. Условие len(w) > 3 стоит в части if включения.

Prompt
Напишите программу на Python со словами one, two, three, four в списке. С помощью спискового включения с частью if оставьте слова длиннее 3 букв. Выведите результат.
Вывод: полная программа на Python
Filter a list

Фильтрация словаря

Пройдите по items() и оставьте пары, ключ которых оканчивается на "1", а значение больше 10. endswith() проверяет конец строки.

Prompt
Создайте словарь с ключами key1, key2, key3, key11 и значениями 1, 2, 3, 11. С помощью словарного включения по items() оставьте только те пары, ключ которых оканчивается на "1", а значение больше 10. Выведите новый словарь.
Вывод: полная программа на Python
Filter a dictionary

Фильтрация с использованием индекса

enumerate даёт индекс и значение. Слово остаётся, только если его индекс не равен 0 и в нём меньше 5 букв.

Prompt
Возьмите слова one, two, three, four. Используйте enumerate в списковом включении, чтобы условие видело и индекс, и слово. Оставьте слово, только если его индекс не равен 0 и в нём меньше 5 букв. Выведите оставленные слова.
Вывод: полная программа на Python
Filter using the index

Фильтрация с инвертированным условием

Отбросьте слова из 3 букв или короче. Условие len(w) = 3 инвертируется с помощью not, поэтому остаются только более длинные слова.

Prompt
Возьмите слова one, two, three, four. Отфильтруйте их списковым включением, но инвертируйте условие с помощью not, чтобы слова из 3 букв или короче были отброшены. Выведите результат.
Вывод: полная программа на Python
Filter with a negated condition

Фильтрация по типу

Список содержит None, целое число, две строки и число с плавающей точкой. isinstance(v, str) находит строки. Каждая из них выводится в верхнем регистре.

Prompt
Создайте список, содержащий None, 1, "two", 3.0 и "four". Пройдите по нему в цикле и с помощью isinstance найдите значения, которые являются строками. Выведите каждую строку в верхнем регистре, по одной в строке.
Вывод: полная программа на Python
Filter by type

Удаление значений None

Список содержит строки, но некоторые элементы равны None. Оставьте значения, которые не равны None, с помощью проверки is not None.

Prompt
Создайте список, содержащий None, "one", None и "two". С помощью спискового включения оставьте только значения, которые не равны None. Выведите полученный список.
Вывод: полная программа на Python
Filter out None values

Разбиение

Иногда нужны обе группы: элементы, которые соответствуют условию, и те, которые не соответствуют.

Встроенной функции partition для списков в Python нет. Это делает небольшая вспомогательная функция: она один раз проходит по списку и добавляет каждый элемент либо в список match, либо в список rest. Функция возвращает оба списка, потому что функция в Python может вернуть больше одного значения.

Можно также написать два включения — одно с условием, другое с его отрицанием, — но тогда список обходится дважды; вспомогательная функция делает один проход.

Разделение списка на два

Слова длиннее 3 букв попадают в match; все остальные — в rest. Выводятся оба списка.

Prompt
Напишите вспомогательную функцию partition, которая делит список на два: элементы, проходящие условие, и остальные. Примените её к словам one, two, three, four с условием «длиннее 3 букв». Выведите список подходящих слов, а затем остальные.
Вывод: полная программа на Python
Split a list in two

Проверка предикатов

Иногда нужны не сами подходящие элементы, а только ответ «да» или «нет». Для этого в Python есть встроенные функции:

  • any: проходит ли проверку хотя бы один элемент? На это отвечает any().
  • none: не проходит ли проверку ни один элемент? Поставьте not перед any().
  • all: проходит ли проверку каждый элемент? На это отвечает all().

Обе функции принимают последовательность значений True/False, поэтому им передают выражение-генератор, например w.endswith("e") for w in numbers. any() останавливается, как только находит совпадение.

Без условия вопрос «есть ли вообще элементы?» — это len(numbers) > 0, а «нет ли вообще элементов?» — это len(numbers) == 0.

Для пустого списка all() возвращает True. В нём нет элемента, который не проходит проверку, поэтому проверка никогда не нарушается. Это называется бессодержательной истиной.

any

Проверьте, оканчивается ли хотя бы одно слово на "e", а затем проверьте, есть ли в списке вообще хоть один элемент.

Prompt
Возьмите слова one, two, three, four. С помощью встроенной функции any() и выражения-генератора проверьте, оканчивается ли хотя бы одно слово на "e", и выведите ответ. Затем выведите, есть ли в списке хоть один элемент, проверив, что его длина больше 0.
Вывод: полная программа на Python
any

none

Проверьте, что ни одно слово не оканчивается на "a", а затем проверьте, пуст ли список.

Prompt
Возьмите слова one, two, three, four. С помощью not и any() проверьте, что ни одно слово не оканчивается на "a", и выведите ответ. Затем выведите, пуст ли список, проверив, что его длина равна 0.
Вывод: полная программа на Python
none

all

Проверьте, оканчивается ли каждое слово на "e". Затем вызовите all() для пустого списка, что даёт True.

Prompt
Возьмите слова one, two, three, four. С помощью встроенной функции all() проверьте, оканчивается ли каждое слово на "e", и выведите ответ. Затем вызовите all() с тем же условием для пустого списка и выведите ответ.
Вывод: полная программа на Python
all