介绍
filter()函数的用法
在现实的工作学习中,我们时常要处理序列数据,如列表、字典、字符串、元组、集合等,这些序列数据中往往有很多元素是无效数据,或者我们只需要从中筛选出部分具有代表性的数据,实现这种功能的方式有很多种,利用python的内置函数**filter()**以很方便地实现对序列数据进行过滤。
filter()函数的语法格式如下:
newIter = Type(filter(function, iterable))
function 和 iterable 分别是判断函数以及待过滤的对象,这里面的function可以根据实际需求自定义的设计,也可以为None。
在Python3中,filter() 的返回的是一个迭代器对象,可以用 list()、tuple() 等方法获取过滤后得到的新序列。
实例
一、 下面通过几个实例来演示 filter() 函数的用法。比如说,定义一个 list 变量,里边放置若干学生的成绩信息(包括语文、数学和英语)。要求使用 filter() 函数筛选出能参加数学竞赛的学生名单。
如何认定一个学生的单科能力呢?我们可能要多方位考虑,单科成绩特别优秀固然是我们需要考虑的对象,但综合成绩优秀也不应该被舍弃,因为可能别的科目分散了学生的部分精力。因此,针对这个案例我们可以这样设计过滤的逻辑:
- 数学单科98分以上
- 数学单科95分以上
- 没有不及格科目
- 平均分90以上
- 数学单科成绩不低于85分
代码实现
scores = [ ("Emma", 89 , 99 , 59),
("Edith", 99 , 86 , 94),
("Sophia", 99 , 60 , 20),
("May", 100 , 95 , 59),
("Ashley", 89 , 90 , 59),
("Arny", 89 , 90, 69),
("Lucy", 79 , 90 , 59 ),
("Gloria", 85 , 90 , 59),
("Abby", 88 , 91 , 90)]
def handle_filter(a):
for i in range(len(scores)):
if scores[i][2]>=98:
return True
elif scores[i][2]>=95:
if scores[i][1]>=60 and scores[i][3]>=60:
return True
elif scores[i][2]>=85:
if sum(scores[i][1:])/3>=90:
return True
return False
newIter = list(filter(handle_filter, scores))
print(newIter)
输出结果为:
[('Emma', 89, 99, 59), ('Edith', 99, 86, 94)]
此程序中,自定义的 handle_filter()是针对实际需求设计的过滤逻辑,作为 filter() 的第一个参数,根据实际需求可以灵活变通。在 Python 3.x 中 filter() 函数最终输出的是迭代器对象,因此还需要借助 list() 内置函数,将其转化为列表。
二、 python 中有个内置函数 lambda ,他可以在不指定函数名称的情况下定义一些简单逻辑的函数,可以定义一个函数给变量。Python 中的 lambda 函数是内联函数和匿名函数,这些函数可以与 filter 方法一起使用。
让我们通过一个简单的示例来了解如何将两者结合使用。请参阅以下 Python 代码。
array = [11, 23, 13, 4, 15, 66, 7, 8, 99, 10]
new_array = list(filter(lambda x : x <= 20, array))
print("Old Array:", array)
print("New Array:", new_array)
输出:
Old Array: [11, 23, 13, 4, 15, 66, 7, 8, 99, 10]
New Array: [11, 13, 4, 15, 7, 8, 10]
像一些比较简单的过滤功能,我们都可以通过lambda 函数来实现,比如需要从字符串列表中过滤出所有长度为5的字符串。
array = ["hello", "python", "world", "walking", "sleep", "shelter", "food"]
new_array = list(filter(lambda x : len(x) == 5, array))
print("Old Array:", array)
print("New Array:", new_array)
输出:
Old Array: ['hello', 'python', 'world', 'walking', 'sleep', 'shelter', 'food']
New Array: ['hello', 'world', 'sleep']