python代码:filter()函数
笔者的话:定义描述得比较抽象,可以从示例中加深对filter()函数的理解。
"""
filter(function or None, iterable) --> filter object
Return an iterator yielding those items of iterable for which function(item)
is true. If function is None, return the items that are true.
"""
# 功能
# filter() 函数用于 过滤 可迭代对象中不符合条件的元素,返回由符合条件的元素组成的新的迭代器。
# filter() 函数把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False,来决定保留或丢弃该元素。
# 参数说明:
# (1) function:用于实现判断的函数,可以为 None。
# (2) iterable:可迭代对象,如列表、range 对象等。
# (3) 返回值:返回一个迭代器对象。
# # 例子1:判断是否是奇数,True是奇数,False是偶数。
# def is_odd_number(number):
# return (number % 2) != 0
#
# result = filter(is_odd_number, range(10)) # [1, 3, 5, 7, 9]
# print([i for i in result])
# # ----
# # 例子2:筛选指定范围的数据
# # 定义学生列表,对 2020 年高考理科成绩进行筛选,获得成绩在 600 分到 700 分之间的学生信息。
# def find(item): # 创建函数
# score = int(item[1])
# return True if 600 <= score < 700 else False # 判断条件
#
# list1 = [
# ("小明", 600), ("小刚", 601), ("小雅", 524),
# ("小旭", 714), ("小章", 624), ("小白", 635),
# ("小赵", 480), ("小高", 580), ("小王", 541),
# ("小琪", 680)
# ]
# new_list = filter(find, list1) # 过滤序列中不符合条件的元素
# list2 = list(new_list) # 使用list()函数转换为列表
# print(list2) # 输出学生列表 # [('小明', 600), ('小刚', 601), ('小章', 624), ('小白', 635), ('小琪', 680)]
# print(f"600分以上: {len(list2)} 人") # 600分以上: 5 人
# # ----
# # 例子3:筛选类型不是字符的元素
# # 在一个集合中有一组数据,包括字符串、数字等,筛选出类型不是字符串的元素
# a = {"AmoXiang", 123, 12.5, -2}
# print(type(a))
# print(set(filter(lambda x: type(x) != str, a)))
# # ----
# # 例子4:取出字符串中的数字并转换为整型
# # 取出一组注册信息中的数字,然后转换为整数。首先判断字符串是否为数字,然后使用 filter() 函数过滤数字,最后转换为整型输出
# a1 = "ISVO0020N2WTRJ4T0XXGQ5QWP9Z"
# a2 = filter(str.isdigit, a1) # 过滤数字
# a3 = list(a2) # 转换为列表 # ['0', '0', '2', '0', '2', '4', '0', '5', '9']
# num = "".join(a3) # 连接列表 # '002024059'
# print(int(num)) # 转换为整型输出 # 2024059
# # ----
# # 例子5:去除序列中所有值为假的元素
# # 如果将 filter() 函数的第一个参数 function 的值设置为 None,就会默认去除序列中所有值为假的元素,如 None、False、0、’’、()、[] 和 {}等
# data = [1, '', 0, 'C', None, [0, 1, 2], False, 3.14, [], {'c': 1, 3: None}, {}]
# result = filter(None, data) # 去除序列中为假的元素
# print(list(result)) # [1, 'C', [0, 1, 2], 3.14, {'c': 1, 3: None}]
# # ----
# # 例子6:获取序列中被删除的元素
# # filter() 函数的返回值是一个可迭代对象,利用 for 循环将返回数据与原始数据比较,就可以判断出哪些元素被删除了。
# data = [1, '', 0, 'C', None, [0, 1, 2], False, 3.14, [], {'c': 1, 3: None}, {}]
# result = filter(None, data) # 去除序列中为假的元素 # [1, 'C', [0, 1, 2], 3.14, {'c': 1, 3: None}]
# delete_data = data
# # for i in result:
# # if i in data:
# # delete_data.remove(i)
# [delete_data.remove(i) for i in result if i in data] # 列表解析
# # print(f"被删除的元素为: {delete_data}") # 被删除的元素为: ['', 0, None, False, [], {}]
# # ----
# # 例子7:
# # 举例来说,当索引值为1时,在data中查找是否有等于1的元素,如果有,就记录下该索引值。
# data = [1, 213, 22, 2, 2, 2, 22, 2, 2, 32]
# # len(data) = 10
# # range(len(data)) = range(0, 10), 即[0 - 10)
# # [i for i in range(len(data))], 即[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# result = filter(lambda x: x in data, [i for i in range(len(data))]) # [1, 2]
# print([i for i in result])
# # ----
# # 例子8:判断是否已经收藏某课程
# # 在线课堂项目中,用户可以收藏喜欢的课程。如果之前已经收藏过该课程,则不用收藏。
# # 所以每次收藏之前,需要查询该课程是否已经收藏。
# class Course(object):
# """课程类"""
# def __init__(self, course_id):
# self.course_id = course_id
#
# # 判断是否已经收藏
# def is_favorite(course_id):
# # 获取所有收藏的课程id
# course = list(filter(lambda c: c.course_id == course_id, course_list))
# if len(course) > 0:
# return True
# return False
#
# if __name__ == '__main__':
# course_list = []
# for i in range(1, 10):
# # 实例化9个课程类,并传递课程id
# course_list.append(Course(i))
# print(is_favorite(7)) # True
# print(is_favorite(10)) # False
# # ----
# # 例子9:删除 None 或者空字符串
# def is_not_empty(s):
# return s and len(s.strip()) > 0 # 或者直接return s and s.strip()
#
# result = filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
# print(list(result)) # ['test', 'str', 'END']
# # ----
# # 例子10:请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:
# # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# import math
#
# def is_sqr(x):
# r = int(math.sqrt(x))
# return r * r == x
#
# t = filter(is_sqr, range(1, 101))
# print(list(t)) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# # ----
# # 例子11:filter的func携带额外参数
# # 定义func的时候,携带多个参数,在filter调用时再使用一个lambda来完成额外参数的传递。
# data = [
# {'name': 'jim', 'money': 133, 'home': 'ame'},
# {'name': 'tom', 'money': 456, 'home': 'chin'}
# ]
#
# def func(v, a):
# if v.get('name') == a:
# return True
# return False
#
# res = filter(lambda x: func(x, 'tom'), data)
# print(f'res:{list(res)}') # res:[{'name': 'tom', 'money': 456, 'home': 'chin'}]
# # ----
# # 例子12:带有None函数的Python filter()示例 (Python filter() example with None function)
# # Notice that zero, empty string, False and None are filtered out because their boolean value is False.
# # 请注意,零,空字符串,False和None被过滤掉,因为它们的布尔值是False。
# data = (True, False, 1, 0, 0.0, 0.5, '', 'A', None)
# result = filter(None, data)
# print(list(result)) # [True, 1, 0.5, 'A']
# # ----
# 例子13: 定义一个 list 变量,里边放置若干学生的成绩信息(包括语文、数学和英语)。要求使用 filter() 函数筛选出偏科的学生名单。
# 如何认定学生是否偏科呢?符合如下其中一条的学生,将被视为偏科:
# 有 2 科成绩在 80 分以上,有一科在 60 分以下。
# 有 1 科成绩在 90 分以上,另外 2 科成绩都在 60 分以下。
# 有 1 科成绩在 90 分以上,但三科的平均分在 70 分以下。
#
# 实现代码如下:
scores = [("Emma", 89, 90, 59),
("Edith", 99, 49, 59),
("Sophia", 99, 60, 20),
("May", 40, 94, 59),
("Ashley", 89, 90, 59),
("Arny", 89, 90, 69),
("Lucy", 79, 90, 59),
("Gloria", 85, 90, 59),
("Abby", 89, 91, 90)]
def handle_filter(a):
s = sorted(a[1:]) # 对三科成绩进行排序
# 有 2 科成绩在 80 分以上,并且有 1 科在 60 分以下的
if s[-2] > 80 and s[0] < 60:
return True
# 有 1 科成绩在 90 分以上,另外 2 科成绩都在 60 分以下
if s[-1] > 90 and s[1] < 60:
return True
# 有 1 科成绩在 90 分以上, 且 3 科的平均分在 70 分以下
if s[-2] > 90 and sum(s) / len(s) < 70:
return True
return False
result = list(filter(handle_filter, scores))
print(result) # [('Emma', 89, 90, 59), ('Edith', 99, 49, 59), ('May', 40, 94, 59), ('Ashley', 89, 90, 59), ('Gloria', 85, 90, 59)]
# ----
|