Python中内置函数filter函数用法详解

引言

Python中的filter函数是一种内置的高效过滤器,用于从序列中筛选出符合特定条件的元素,生成一个由符合条件元素组成的新列表。filter函数在Python中广泛应用于数据清洗和预处理,是Python开发者必备的技能之一。本文将详细介绍filter函数的用法,并通过实例代码阐述其应用场景。

Python中内置函数filter函数用法详解

一、filter函数基本用法

语法结构filter(function, iterable)

参数说明

  • function:用于筛选元素的函数,该函数应返回一个布尔值,表示元素是否符合筛选条件。
  • iterable:待筛选的序列,可以是列表、元组、集合等可迭代对象。

返回值filter函数返回一个由符合条件的元素组成的新列表。

二、filter函数应用场景

1、筛选符合条件的元素

filter函数可以用于从序列中筛选出符合特定条件的元素。例如,从一个列表中筛选出所有偶数:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]  
even_numbers = filter(lambda x: x % 2 == 0, numbers)  
print(list(even_numbers))  # Output: [2, 4, 6, 8]

在这个例子中,我们传递了一个匿名函数作为filter函数的第一个参数,该函数用于判断一个数字是否为偶数。filter函数将这个函数应用于序列中的每个元素,筛选出符合条件的偶数元素。

2、数据清洗和预处理

filter函数在数据清洗和预处理方面非常有用。例如,我们可以使用filter函数来删除一个列表中的空字符串和None值:

strings = [\'hello\', \'\', \'world\', None, \'python\', \'programming\']  
clean_strings = filter(lambda x: x or x.strip(), strings)  
print(list(clean_strings))  # Output: [\'hello\', \'world\', \'python\', \'programming\']

在这个例子中,我们传递了一个匿名函数作为filter函数的第一个参数,该函数用于判断一个字符串是否为非空字符串或者可以去除空格后的非空字符串。filter函数将这个函数应用于序列中的每个元素,筛选出符合条件的非空字符串元素。

3、复杂条件筛选

filter函数也可以用于复杂条件的筛选。例如,我们可以使用filter函数来从一个列表中筛选出既是偶数又是正数的元素:

numbers = [-1, -2, 3, 4, -5, 6]  
positive_even_numbers = filter(lambda x: x > 0 and x % 2 == 0, numbers)  
print(list(positive_even_numbers))  # Output: [4, 6]

在这个例子中,我们传递了一个匿名函数作为filter函数的第一个参数,该函数用于判断一个数字是否为正数且为偶数。filter函数将这个函数应用于序列中的每个元素,筛选出符合条件的正偶数元素。

4、与其他函数结合使用

filter函数可以与其他Python函数结合使用,以实现更复杂的筛选逻辑。例如,我们可以使用filter函数来筛选出一个列表中符合特定条件的元素,并使用map函数对筛选出的元素进行进一步处理。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]  
even_numbers = filter(lambda x: x % 2 == 0, numbers)  
squared_even_numbers = map(lambda x: x ** 2, even_numbers)  
print(list(squared_even_numbers))  # Output: [4, 16, 36, 64]

在这个例子中,我们首先使用filter函数筛选出列表中的偶数元素,然后使用map函数将筛选出的元素平方。最后,我们使用list函数将结果转换为列表并打印输出。

三、filter函数与lambda表达式

在上面的例子中,我们使用了lambda表达式作为filter函数的第一个参数,用于定义筛选条件。Lambda表达式是一种简洁的函数定义方式,可以在需要时定义简单的匿名函数。

Lambda表达式的一般语法如下:

lambda arguments: expression

其中,arguments是函数的参数列表,expression是函数的主体部分,即函数的代码块。Lambda表达式可以看作是一种将函数定义、函数调用和返回结果融为一体的简洁写法。

四、filter函数与列表推导式

列表推导式是Python中一种高效的数据处理方法,可以用于将列表中的元素按照一定条件进行筛选和转换。列表推导式的语法如下:

[expression for item in iterable if condition]

其中,expression是表达式,用于对每个元素进行转换或处理;item是迭代器中的每个元素;iterable是待处理的序列;condition是筛选条件,用于判断元素是否符合要求。

列表推导式与filter函数的结合使用可以实现更为复杂的数据处理需求。例如,下面的代码将筛选出列表中的偶数元素,并将它们平方:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]  
even_numbers = [x ** 2 for x in numbers if x % 2 == 0]  
print(even_numbers)  # Output: [4, 16, 36, 64]

在这个例子中,我们使用了列表推导式来筛选出列表中的偶数元素,并将它们平方。最终结果是一个包含所有筛选出的偶数元素的平方的新列表。

五、总结

filter函数是Python中一个非常实用的内置函数,可以用于从序列中筛选出符合特定条件的元素,生成一个由符合条件元素组成的新列表。通过掌握filter函数的用法,我们可以更方便地进行数据清洗和预处理,实现更为复杂的数据处理需求。同时,掌握lambda表达式和列表推导式的用法也可以帮助我们更高效地使用filter函数。

补充:Python中使用filter过滤列表的一个小技巧

有的时候使用dir(Module),可以查看里面的方法,但是模块自带的属性"__"开头的也会显示,如下:

>>> import random
>>> dir(random)
[\'BPF\', \'LOG4\', \'NV_MAGICCONST\', \'RECIP_BPF\', \'Random\', \'SG_MAGICCONST\', \'SystemRandom\', \'TWOPI\', \'WichmannHill\', \'_Buil
tinMethodType\', \'_MethodType\', \'__all__\', \'__builtins__\', \'__doc__\', \'__file__\', \'__name__\', \'__package__\', \'_acos\', \'_c
eil\', \'_cos\', \'_e\', \'_exp\', \'_hashlib\', \'_hexlify\', \'_inst\', \'_log\', \'_pi\', \'_random\', \'_sin\', \'_sqrt\', \'_test\', \'_test_
generator\', \'_urandom\', \'_warn\', \'betavariate\', \'choice\', \'division\', \'expovariate\', \'gammavariate\', \'gauss\', \'getrandbi
ts\', \'getstate\', \'jumpahead\', \'lognormvariate\', \'normalvariate\', \'paretovariate\', \'randint\', \'random\', \'randrange\', \'sam
ple\', \'seed\', \'setstate\', \'shuffle\', \'triangular\', \'uniform\', \'vonmisesvariate\', \'weibullvariate\']
>>>

这个时候想过滤以"_"或"__"开头的方法,可以:

>>> filter(lambda s: not s.startswith(\"_\"), dir(random))
[\'BPF\', \'LOG4\', \'NV_MAGICCONST\', \'RECIP_BPF\', \'Random\', \'SG_MAGICCONST\', \'SystemRandom\', \'TWOPI\', \'WichmannHill\', \'betav
ariate\', \'choice\', \'division\', \'expovariate\', \'gammavariate\', \'gauss\', \'getrandbits\', \'getstate\', \'jumpahead\', \'lognormv
ariate\', \'normalvariate\', \'paretovariate\', \'randint\', \'random\', \'randrange\', \'sample\', \'seed\', \'setstate\', \'shuffle\', \'t
riangular\', \'uniform\', \'vonmisesvariate\', \'weibullvariate\']
>>>

从上面来看,使用filter()函数,结合lambda函数很好的完成了任务。 其他的例子,比如想从一个列表中过滤非数字的字符串列表:

>>> L = [\"1234\", \"ABCD\", \"BOOK\"]
>>> filter(lambda s: s.isdigit(), L)
[\'1234\']
>>>

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容