说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
用 iterable 中函数 function 返回真的那些元素,构建一个新的迭代器。iterable 可以是一个序列,一个支持迭代的容器,或一个迭代器。一般用于数据的过滤筛选中。向filter 的第一参数指定函数(可调用对象)、在第二参数中指定诸如列表的可迭代对象。对函数依次应用取值元素,提取被确定为 True 的结果。
简单地说,filter() 方法通过一个函数来过滤给定的 iterable,该函数测试 iterable 中的每个元素是否为真并返回。
filter() 方法的语法是:
filter(function, iterable)
filter() 有两个参数:
如果 function 是 None ,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。
filter() 方法返回一个迭代器(filter 对象),该迭代器通过了 iterable 中每个元素的函数检查,返回的是原序列中的值,非布尔值。
另外,如果未定义函数时,相当于操作if <元素>
,即:
filter(function, iterable) 相当于一个生成器表达式,当 function 不是 None 的时候为 (item for item in iterable if function(item));function 是 None 的时候为 (item for item in iterable if item) 。
[*filter(None,[1,False,3])]
# [1, 3]
以值为偶数(除以2时余数为0)时返回 True 的 lambda(匿名函数)为例:
l = [-2, -1, 0, 1, 2]
print(filter(lambda x: x % 2 == 0, l))
# <filter object at 0x10bb38580>
print(type(filter(lambda x: x % 2 == 0, l)))
# <class 'filter'>
返回 filter 型的对象,即使直接 print(),也不输出内容的值,可以用 for 循环等方式取出来。
for i in filter(lambda x: x % 2 == 0, l):
print(i)
# -2
# 0
# 2
如下是一些案例:
# 筛选大于 5 的值
f = filter(lambda x: x>5, [2,3,5,7,9])
f # <filter at 0x7fe33ea36730>
list(f)
# [7, 9]
# 函数为 None
f = filter(None, [2,False,5,None,9])
list(f)
# [2, 5, 9]
以下是一个元音筛选功能:
# list of letters
letters = ['a', 'b', 'd', 'e', 'i', 'j', 'o']
# function that filters vowels
def filter_vowels(letter):
vowels = ['a', 'e', 'i', 'o', 'u']
if(letter in vowels):
return True
else:
return False
filtered_vowels = filter(filter_vowels, letters)
print('The filtered vowels are:')
for vowel in filtered_vowels:
print(vowel)
'''
The filtered vowels are:
a
e
i
o
'''
传入 None,使用自身身份布尔检测:
strings = ['apple', '', 'banana', '', 'cherry']
non_empty_strings = filter(None, strings)
list(non_empty_strings)
# ['apple', 'banana', 'cherry']
可以用列表表达式实现它的功能:
l = [-2, -1, 0, 1, 2]
[x for x in l if x % 2 == 0]
# [-2, 0, 2]
[x for x in l if x % 2 != 0]
# [-1, 1]
l_s = ['apple', 'orange', 'strawberry']
[x for x in l_s if x.endswith('e')]
# ['apple', 'orange']
[x for x in l_s if not x.endswith('e')]
# ['strawberry']
l = [-2, -1, 0, 1, 2]
[x for x in l if x]
# [-2, -1, 1, 2]
l_2d = [[0, 1, 2], [], [3, 4, 5]]
[x for x in l_2d if x]
# [[0, 1, 2], [3, 4, 5]]
了解下 itertools.filterfalse()
,只有 function 返回 false 时才选取 iterable 中元素的补充函数,详见:itertools.filterfalse() 按假值筛选。
更新时间:2024-07-04 08:32:17 标签:python filter