python中的几个常用高阶函数包括:filter、map、reduce、zip、sorted
本文主要对filter进行说明
filter
(function, iterable)
python内建函数,用于过滤序列。接收两个参数,函数及可迭代对象。将可迭代对象中的值依次传递给函数进行处理,保留返回值为Ture的元素。
示例1 返回列表中大于N的数
a = [1, 2, 3, 4, 5, 6, 7]
print(list(filter(lambda x: x > 4, a)))
print([i for i in a if i > 4])
#输出
[5, 6, 7]
[5, 6, 7]
上例为打印列表中大于4的元素,函数部分使用了lambda表达式,从列表a中找到并返回大于4的值。而filter返回的是一个filter对象,需要转化为list或其他序列查看其中的元素。
示例2 返回列表中所有数的平方
a = [1, 2, 3, 4, 5, 6, 7]
print(tuple(filter(lambda x:x*x, a)))
#输出
(1, 2, 3, 4, 5, 6, 7)
可见这种操作对于filter并不合适,因为所有元素都能进行平方计算,所以每个元素返回的都是True,并不是返回所有元素的平台,所以此操作应该由map函数来完成。这也是这两个函数的主要区别,filter用于所有值的过滤,而map用于所有值的计算
示例3 去掉列表中所有的偶数
a = [1, 2, 3, 4, 5, 6, 7]
print(list(filter(lambda x: x % 2 == 1, a)))
print([i for i in a if i % 2 != 0])
#输出
[1, 3, 5, 7]
[1, 3, 5, 7]
示例4 去掉列表中的空元素
a = ['A', '', 'B', None, 'C', ' ']
print(list(filter(lambda x: x and x.strip(), a)))
print([x for x in a if x is not None and x.strip() != ''])
#输出
['A', 'B', 'C']
['A', 'B', 'C']
示例5 用filter统计质数
def find_prime(num):
odd_list = []
prime_set = set()
i=3
while i<=num:
odd_list.append(i)
i += 2
while len(odd_list)>0:
prime_num = odd_list.pop(0)
prime_set.add(prime_num)
odd_list = list(filter(lambda x:x%prime_num != 0, odd_list))
prime_set.add(2)
return prime_set
print(find_prime(100))
#输出
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}
第一个while循环生成一个值包含奇数的列表,第二个while循环遍历奇数列表,弹出首个元素(肯定为质数)加入到set集合中,每次使用filter函数去掉odd_list中该元素的倍数,生成新的odd_list用于顶层循环。用set保存结果,使成员in / not in操作更快。
示例6 对于给定列表中的元素判断哪些是质数
alist = [4,1,51,24,56,85,85,23,137]
prime_set = find_prime(max(alist))
print(list(filter(lambda x:x in prime_set, alist)))
#输出
[23, 137]
调用示例5的函数,以给定列表的最大值生成质数集合,依次遍历列表的值,判断是否存在与集合中