- №31 Функция Filter() / для начинающих
- Примеры функции filter()
- Фильтр нечетных чисел
- Python filter() Function
- Definition and Usage
- Syntax
- Parameter Values
- COLOR PICKER
- Report Error
- Thank You For Helping Us!
- Использование функции фильтра Python
- Использование filter() с функцией
- Использование None с filter()
- Использование filter() со списком словарей
- Заключение
№31 Функция Filter() / для начинающих
Функция filter() в Python применяет другую функцию к заданному итерируемому объекту (список, строка, словарь и так далее), проверяя, нужно ли сохранить конкретный элемент или нет. Простыми словами, она отфильтровывает то, что не проходит и возвращает все остальное.
Объект фильтра — это итерируемый объект. Он сохраняет те элементы, для которых функция вернула True . Также можно конвертировать его в list, tuple или другие типы последовательностей с помощью фабричных методов.
В этом руководстве разберемся как использовать filter() с разными типами последовательностей. Также рассмотрим примеры, которые внесут ясность в принцип работы.
Функция filter() принимает два параметра. Первый — имя созданной пользователем функции, а второй — итерируемый объект (список, строка, множество, кортеж и так далее).
Она вызывает заданную функцию для каждого элемента объекта как в цикле. Синтаксис следующий:
# Синтаксис filter()
filter(in_function|None, iterable)
|__filter objectПервый параметр — функция, содержащая условия для фильтрации входных значений. Она возвращает True или False . Если же передать None , то она удалит все элементы кроме тех, которые вернут True по умолчанию.
Второй параметр — итерируемый объект, то есть последовательность элементов, которые проверяются на соответствие условию. Каждый вызов функции использует один из объектов последовательности для тестирования.
Возвращаемое значение — объект filter , который представляет собой последовательность элементов, прошедших проверку.
Примеры функции filter()
Фильтр нечетных чисел
В этом примере в качестве итерируемого объекта — список числовых значений
Python filter() Function
Filter the array, and return a new array with only the values equal to or above 18:
def myFunc(x):
if x < 18:
return False
else:
return Trueadults = filter(myFunc, ages)
Definition and Usage
The filter() function returns an iterator where the items are filtered through a function to test if the item is accepted or not.
Syntax
Parameter Values
Parameter | Description |
---|---|
function | A Function to be run for each item in the iterable |
iterable | The iterable to be filtered |
COLOR PICKER
Report Error
If you want to report an error, or if you want to make a suggestion, do not hesitate to send us an e-mail:
Thank You For Helping Us!
Your message has been sent to W3Schools.
Top Tutorials
Top References
Top Examples
Get Certified
W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.
Использование функции фильтра Python
Встроенная функция filter() Python может использоваться для создания нового итератора из существующего итерируемого объекта (например списка или словаря), который эффективно отфильтрует элементы с помощью предоставленной нами функции. Итерируемый объект — это объект Python, по которому можно выполнить итерацию, то есть он вернет элементы в такой последовательности, которую мы можем использовать в цикле for .
Базовый синтаксис для функции filter() :
Это вернет итерируемый объект фильтра. Мы можем использовать функцию, например list() , для составления списка всех элементов, возвращенных в объекте фильтра.
Функция filter() обеспечивает способ фильтрации значений, который зачастую может быть более эффективным, чем генератор списка, особенно когда мы начинаем работу с большими наборами данных. Например, генератор списка составит новый список, что увеличит время этой обработки. Это означает, что после того, как генератор списка закончит выражение, у нас в памяти будет два списка. Однако filter() сделает простой объект, содержащий ссылку на оригинальный список, предоставляемую функцию и индекс пути в оригинальном списке, что занимает меньший объем памяти.
В этом обучающем модуле мы рассмотрим четыре разных способа использования filter() : с двумя различными итерируемыми структурами, с функцией lambda и без определенной функции.
Использование filter() с функцией
Первый аргумент в filter() — это функция, которую мы используем для решения о включении или фильтрации каждого элемента. Функция вызывается один раз для каждого элемента в итерируемом объекте, переданном как второй аргумент и каждый раз при возвращении False значение сбрасывается. Поскольку этот аргумент является функцией, мы можем либо передать обычную функцию, либо использовать функции lambda , особенно когда выражение является менее сложным.
Ниже приводится синтаксис lambda с filter() :
filter(lambda item: item[] expression, iterable)
С помощью списка ниже можно включить функцию lambda с выражением, по которому мы хотим оценить каждый элемент из списка:
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']
Чтобы отфильтровать этот список для поиска названий наших аквариумных созданий, начинающихся с гласной, мы можем запустить следующую функцию lambda :
print(list(filter(lambda x: x[0].lower() in 'aeiou', creature_names)))
Здесь мы заявляем в нашем списке элемент в качестве x . Затем мы настроим наше выражение для доступа к первому символу каждой строки (или символу «нуль»), то есть x[0] . Установка нижнего регистра в каждом из названий обеспечит соответствие букв строке в нашем выражении, 'aeiou' .
Наконец, мы передадим итерируемому объекту creature_names . Как и в предыдущем разделе, мы применяем list() к результату, чтобы создать список из возвратов итератора filter() .
Вывод будет выглядеть следующим образом:
Этот же результат можно получить с помощью определяемой нами функции:
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie'] def names_vowels(x): return x[0].lower() in 'aeiou' filtered_names = filter(names_vowels, creature_names) print(list(filtered_names))
Наша функция names_vowels определяет выражение, которое мы будем применять для фильтра creature_names .
Снова, вывод будет выглядеть следующим образом:
В целом, функции lambda достигают того же результата с filter() , что и при использовании обычной функции. Необходимость определения обычной функции растет по мере увеличения сложности выражений для фильтрации наших данных, что, скорее всего, будет способствовать улучшению читабельности нашего кода.
Использование None с filter()
Мы можем передать None в качестве первого аргумента filter() , чтобы исключить из возвращенного фильтра итератора любые значения, которые Python считает «ложными». Обычно Python считает все значения длиной 0 (например пустой список или пустую строку) или числовой эквивалент 0 ложными, отсюда использование термина «ложный».
В следующем случае мы хотим фильтровать наш список так, чтобы отображались только номера номера емкостей в нашем аквариуме:
aquarium_tanks = [11, False, 18, 21, "", 12, 34, 0, [], >]
В этом коде у нас есть список, содержащий целые числа, пустые последовательности и логическое значение.
filtered_tanks = filter(None, aquarium_tanks)
Мы используем функцию filter() с None и передадим список aquarium_tanks в качестве нашего итерируемого объекта. Поскольку мы передали None в качестве первого аргумента, проверим, считаются ли элементы в нашем списке ложными.
Затем обернем filtered_tanks в функцию list() для возврата списка для filtered_tanks при печати.
Здесь мы видим, что вывод отображает только целые значения. Все элементы, оцененные как False , равные 0 по длине, были удалены filter() :
Примечание. Если мы не используем list() и печатаем filtered_tanks , мы получим объект фильтра вроде . Объект фильтра является итерируемым, поэтому мы можем пройтись по нему с помощью for или использовать list() для превращения его в список, который мы здесь делаем, так как это хороший способ проверки результатов.
C None мы использовали filter() для быстрого удаления элементов из нашего списка, которые считались ложными.
Использование filter() со списком словарей
Когда у нас имеется более сложная структура данных, мы все еще можем использовать filter() для оценки каждого из элементов. Например, если у нас есть список словарей, мы не только хотим выполнить итерацию по каждому элементу в списке — одному из словарей, — но мы также хотим выполнить итерацию по каждой паре key:value в словаре, чтобы оценить все данные.
Например, допустим, у нас есть список всех созданий в аквариуме с различными данными о каждом из них:
aquarium_creatures = [ "name": "sammy", "species": "shark", "tank number": "11", "type": "fish">, "name": "ashley", "species": "crab", "tank number": "25", "type": "shellfish">, "name": "jo", "species": "guppy", "tank number": "18", "type": "fish">, "name": "jackie", "species": "lobster", "tank number": "21", "type": "shellfish">, "name": "charlie", "species": "clownfish", "tank number": "12", "type": "fish">, "name": "olly", "species": "green turtle", "tank number": "34", "type": "turtle"> ]
Мы хотим фильтровать эти данные по строке поиска, которую мы предоставили функции. Для доступа filter() к каждому словарю и каждому элементу в словарях, мы создадим вложенную функцию, например:
def filter_set(aquarium_creatures, search_string): def iterator_func(x): for v in x.values(): if search_string in v: return True return False return filter(iterator_func, aquarium_creatures)
Мы определяем функцию filter_set() , которая принимает aquarium_creatures и search_string в качестве параметров. В filter_set() мы передадим iterator_func() в качестве функции filter() . Функция filter_set() вернет итератор, полученный от filter() .
iterator_func() принимает x в качестве аргумента, представляющего элемент в нашем списке (т.е. единый словарь).
Затем цикл for получит доступ к каждой паре key:value в наших словарях, а затем будет использовать условное выражение для проверки того, есть ли search_string в v , представляя значение.
Как и в предыдущих примерах, если выражение оценивает значение как True , функция добавляет элемент в объект фильтра. Оно вернется после выполнения функции filter_set() . Мы расположим return False за пределами нашего цикла для проверки каждого элемента в каждом словаре вместо получения результатов после проверки одного первого словаря.
Мы вызовем filter_set() с нашим списком словарей и строкой поиска, для которых мы хотим найти совпадения:
filtered_records = filter_set(aquarium_creatures, "2")
После выполнения функции мы сохраним объект фильтра в переменной filtered_records , которую мы превращаем в список и печатаем:
print(list(filtered_records))
Мы увидим следующий вывод из этой программы:
Мы отфильтровали список словарей по строке поиска 2 . Мы видим, что вернулись три словаря, включающие номер емкости с 2 . Использование нашей собственной вложенной функции позволило нам получить доступ к каждому элементу выполнить эффективную проверку относительно каждой строки поиска.
Заключение
В этом обучающем модуле мы узнали о различных способах использования функции filter() в Python. Теперь вы можете использовать filter() со своей собственной функцией, функцией lambda или с None для фильтрации элементов структур данных различной сложности.
Хотя в этом обучающем модуле мы сразу же печатали результаты из filter() в формате списка, в наших программах мы, скорее всего, будем использовать возвращенный объект filter() и выполнять дальнейшие манипуляции с данными.
Для получения дополнительной информации о Python ознакомьтесь с нашей серией Программирование на Python 3 и посетите нашу тематическую страницу, посвященную Python.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.