filter()
| Введение | |
| Пример без лямбды | |
| Пример с лямбдой | |
| Применение совместо со split() | |
| Похожие статьи |
Введение
# -> returns only those elements of iterable # where function returned True
Синтаксис
filter(function, sequence)
Возвращает функция filter() объект
<filter object at 0x7f5e0bf2e2b0>
который можно передать, например в list()
Пример без лямбд
Нужно из списка убрать все элементы, которые не являются строками. Сначала напишем функцию на основе isinstance() , которая возвращает True если объект имеет строковый тип.
def only_str(x): return isinstance(x, str) a = ["a", 1, 2, 3, "b", 4] strings = filter(only_str, a) print(list(strings))
['a', 'b']
Пример с лямбдой
Если создавать отдельную функцию не хочется, можно воспользоваться лямбда функцией
a = ["a", 1, 2, 3, "b", 4] strings = filter(lambda x: isinstance(x, str), a) print(list(strings))
['a', 'b']
С помощью лямбд можно написать довольно широкий набор простых фильтров.
# filter() positives = filter(lambda x: x > 0, [1, -5, 0, 6, -2, 8]) print(positives) print(list(positives)) # Filtering with None trues = filter(None, [0, 1, False, True, [], [1, 2, 3], '', 'hello']) print(list(trues)) # In Python2 map() and filter() are not lazy as in Python3. # They are eager and return lists
[1, 6, 8] [1, True, [1, 2, 3], 'hello']
Применение совместо со split()
split()
может выдать не совсем тот результат, который вы хотите. В частности он добавляет
пустые строки, избавится от которых можно с помощью filter() так как пустая строка
возвращает False.
Допустим, нужно из /hei/hei/ получить
список
из hei и hei
>>> '/hei/hei/'.split('/') ['', 'hei', 'hei', ''] >>> list(filter(None, '/hei/hei/'.split('/'))) ['hei', 'hei']
Автор статьи: Андрей Олегович