filter
Python内置的filter()函数能够从可迭代对象(如字典、列表)中筛选某些元素,并生成一个新的迭代器。可迭代对象是一个可以被“遍历”的Python对象,也就是说,它将按顺序返回各元素,这样我们就可以在for循环中使用它。
filter()函数的基本语法是:
返回一个可迭代的filter对象,可以使用list()函数将其转化为列表,这个列表包含过滤器对象中返回的所有的项。
filter()函数所提供的过滤方法,通常比用列表解析更有效,特别是当我们处理更大的数据集时。例如,列表解析会生成一个新列表,这会增加该处理的运行时间。当列表解析执行完毕它的表达式后,内存中会有两个列表。但是,filter()将生成一个简单的对象,该对象包含对原始列表的引用、提供的函数以及原始列表中位置的索引,这样操作占用的内存更少。
下面介绍filter()的不同用法。
在filter()中使用特殊函数
filter()的第一个参数是一个函数,用它来决定第二个参数所引用的可迭代对象中的每一项的去留。此函数被调用后,当返回False时,第二个参数中的可迭代对象里面相应的值就会被删除。针对这个函数,可以是一个普通函数,也可以使用lambda函数,特别是当表达式不那么复杂的时候。
下面是filter()中使用lambda函数的方法:
fileter(lambda item:item[] expression iterable)
将下面的列表,用于lambda函数,根据lambda函数表达式筛选列表中的元素。
要筛选此列表以元音开头的水族馆生物的名称,lambda函数如下:
在这里,我们将列表中的一个项声明为x,并以x[0]的方式访问每个字符串的第一个字符,并且要将字母转化为小写,以确保将字母与'aeiou'中的字符匹配。
最后,要提供可迭代对向creature_name。与上一节一样,用list()将返回结果转化为列表。
输出如下:
当然,写一个函数,也能够实现类似的结果:
在names_vowels函数中用一个表达式,完成了对creature_names的过滤。
同样,输出如下:
总的来说,在filter()函数中使用lambda函数得到的结果与使用常规函数得到的结果相同。如果所要过滤数据更复杂了,还可能要使用正则表达式,这可能会提高代码的可读性。
在filter()中使用None
我们也可以将None作为filter()的第一个参数,让迭代器过滤掉Python中布尔值是False的对象,比如长度为0的对象(如空列表或空字符串)或在数字上等于0的对象。
下面的示例中要过滤一个列表,去掉其中布尔值是False的元素。
这段代码在filter()中使用了None,并将aquarium_tanks列表作为可迭代项传入。将None作为第一个参数,可以检查列表中的元素是否为False。
然后再将filtered_tanks传给list()函数,这样就得到了一个列表。
从输出结果中可以看出,我们得到了想要的整数,那些布尔值是False的项都筛选掉了。
注意:如果不使用list()并打印filtered_tanks,将得到一个类似于<filter object at 0x7fafd5903240>这样的filter对象。filter对象是可迭代的,因此我们可以使用for循环它,也可以使用list()将其转换为列表。
借助None,用filter()快速地从列表中删除被认为False的项。
浙公网安备 33010602011771号