Python 过滤器,filter过滤器用法

  Python 过滤器,filter过滤器用法

  本文介绍了Python内置的filter()函数,该函数可以从iterable对象(比如字典和列表)中过滤出一些元素,生成一个新的迭代器。iterable对象是可以被“遍历”的Python对象,也就是说,它会按顺序返回元素,这样我们就可以在for循环中使用它。

  filter()函数的基本语法是:

  Filter(function,iterable)返回一个迭代的Filter对象,可以使用list()函数将其转换为列表。该列表包含filter对象中返回的所有项目。

  filter()函数提供的过滤方法通常比列表解析更有效,尤其是当我们处理较大的数据集时。比如列表解析会生成一个新的列表,这会增加这个过程的运行时间。当列表解析完成其表达式时,内存中将有两个列表。但是filter()会生成一个简单的对象,包含对原始列表的引用、提供的函数以及原始列表中位置的索引,这样操作占用的内存就少了。

  下面是filter()的四种不同用法:

  filter()中使用的特殊函数filter()的第一个参数是一个函数,用于确定第二个参数引用的iterable对象中每一项的保留时间。调用此函数后,当返回False时,第二个参数中iterable对象中的对应值将被删除。对于这个函数,可以是普通函数,也可以是lambda函数,尤其是表达式不是那么复杂的时候。

  下面是如何在filter()中使用lambda函数:

  filter(lambda item:item[]expression,iterable)使用下面的lambda函数列表,根据lambda函数表达式过滤列表中的元素。

  Creature _ names=[萨米, GG DMJ ,乔,奥利, WLD BBT ,查理]要过滤列表中以元音字母开头的水族馆生物的名称,lambda函数如下:

  Print (list (filter (lambda x: x[0])。lower() aeiou ,creation _ names)))这里我们将列表中的一个项声明为X,以X [0]的形式访问每个字符串的第一个字符,我们要将字母转换成小写,以确保字母与 aeiou 匹配

  最后,我们需要提供迭代的对立生物名称。和上一节一样,使用list()将返回的结果转换成一个列表。

  输出如下所示:

  [ggdmj , Olly]当然,写一个函数也可以达到类似的效果:

  creative _ names=[ Sammy , ggdmj , Jo , Olly , wldbbt ,Charlie ]def names _元音字母(x): return x [0]。 aeiou filtered _ names=filter(names _元音,creature _ names)print(list(filtered _ names))中的lower()用于names _元音函数中。

  同样,输出如下:

  [ggdmj , Olly]一般来说,在filter()函数中使用lambda函数得到的结果和使用常规函数得到的结果是一样的。如果要过滤的数据更复杂,也可以使用正则表达式,这可以提高代码的可读性。

  在filter()中使用None我们也可以使用None作为filter()的第一个参数,这样迭代器就可以过滤掉Python中布尔值为假的对象,比如长度为0的对象(比如空列表或者空字符串)或者数值等于0的对象。

  在下面的示例中,您希望筛选列表并删除布尔值为False的元素。

  Aquarium_tanks=[11,false,18,21,,12,34,0,[],{}] filtered _ tanks=filter (None,Aquarium_tanks)这段代码在filter()中使用None,并在aquarium _ tanks列表中作为可迭代项传递。将None作为第一个参数,可以检查列表中的元素是否为False。

  打印(list(filtered_tanks))然后将filtered_tanks传递给list()函数,从而得到一个列表。

  从输出结果可以看出,我们得到了想要的整数,那些布尔值为假的项已经被过滤掉了。

  [11,25,18,21,12,34]注:如果不使用list()并打印filtered_tanks,会在0x7fafd5903240处得到一个类似filter对象的filter对象。filter对象是迭代的,所以我们可以用for循环它,或者用list()转换成list。

  在None的帮助下,使用filter()从列表中快速删除被认为是假的项目。

  对复杂的情况使用filter()。对于复杂的数据结构,filter()也可以胜任。例如,如果有一个由字典组成的列表,我们不仅要遍历列表中的每一项(字典),还要遍历字典中的每一个键值对来获取所有的数据。

  例如,假设我们有水族馆中每种生物的列表以及每种生物的不同细节。使用以下列表显示该数据。

  aquarium _ creatures=[{name : Sammy , species: shark , tank number : fish },{name: kkdz , species: crab ,TankNumber: 25 , type : shell },{name: jo , species: guppy , tankNumber: 18 , type: fish},{ name : 物种: 龙虾,缸号: 21 ,类型:贝类 },{ 名称:查理,物种:小丑鱼,缸号: 12 ,类型:鱼 },{ 名称:奥利,物种:绿海龟,缸号: 34 ,类型:海龟 }]下面是一个过滤这些数据的函数。为了让filter()访问每个字典和字典中的每个元素,它需要构造一个嵌套函数,如下所示:

  def filter_set(aquarium _ creations,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 _ creations)定义了以Aquarium _ creations和search _ string为参数的filter _ set()函数。在filter_set()中,将内部函数iterator_func()作为filter()的参数。filter_set()函数将返回filter()生成的迭代器。

  Iterator_func()以x为参数,表示列表中的一项(即单个字典)。

  接下来,for遍历字典中的每个键值对,然后使用条件语句检查search_string是否是键值对中的值。

  iterator_func函数是filter函数的参数对象,用来过滤迭代对象。例如:使用filter_set()搜索字符串:

  Filtered_records=filter _ set(aquarium _ creations, 2 )一旦函数完成,filter对象就存储在filtered _ records变量中,我们将它转换成一个列表并打印出来:

  打印(list(filtered_records))输出内容:

  [{name: KKDZ , species: crab , tankNumber: 25 , type :贝类 },{name :动声, species :龙虾, tankNumber Type :贝类 },{name: Charlie , species :小丑鱼, TankNumber: 12 , Type :鱼 }]在刚才的例子中,我们用filter()过滤了字典列表中的公式化字符。

  在结论中,列出了使用filter()函数的不同方法。如果你打算了解更多,请阅读《Python大学实用教程》这本书(电子工业出版社),这是零起点读者不可多得的读物,特别注重工程实践。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: