Python中filter、map、reduce应用
一、理解迭代器
迭代器迭代器(iterator)
是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。
1.1、map()
返回一个迭代器,该迭代器将函数应用于iterable的每一项,生成结果。如果传递了额外的可迭代参数,函数必须接受那么多参数,并并行地应用于所有可迭代的项。对于多个迭代器,当最短的迭代器耗尽时,迭代器停止。对于函数输入已经安排为参数元组的情况,可能看了以上解释,乍一眼看上去,可能狗屁不通,后续会介绍迭代器、生成器以及可迭代对象的一些概念。
1.2、map()的用法
在使用map之前,首先了解iterable
是什么意思。 其实我们在这里可以把iterable
当做一个列表,现在只需要知道iterable
是一个列表,一个序列就可以了,它能自动的把序列中的每一个值映射到相应的函数中,最后得到值。接下来看看map在python中的语法:
map(function, iterable, ...)
例1:
例如,现在有一个列表,那么列表就是一个序列,可以理解为:iterable
,在map语法中是 map(function, iterable
)现在就知道map(function, 列表
) 的这么一个语法。目前有一个numbers
的列表 其中有1、3、5、7、9 数字。 要求把13579变成246810 最后传入到新的列表并输出如下:
numbers = [1, 3, 5, 7, 9] # 定义一个列表中有1、3、5、7、9
result_numbers = [] # 定义一个空的列表,来接收最后的结果
for i in numbers: # 通过for i in 循环 numbers 列表 得到每一个数字
number = i + 1 # 每一个数字都+1 赋值给新的number变量
result_numbers.append(number) # 通过result_numbers.append 添加到新的列表
print(result_numbers) # 最后输出打印结果
>>> [2, 4, 6, 8, 10]
通过map来实现:
numbers = [1, 3, 5, 7, 9] # 定义一个列表中有1、3、5、7、9
def add(x): # 定义一个add函数,x为值
return x + 1 # 返回一个 x + 1
print(list(map(add, numbers))) # map(add:函数的功能, numbers:一个序列,列表)
>>> [2, 4, 6, 8, 10]
首先定义了一个numbers的列表里面有1、3、5、7、9
接下来定义了一个函数为add 在后面括号中添加一个值。首先我们在调用函数的时候,我们要传一个值得时候我们需要在函数参数中定义一个值,如果两个就定义两个值。此函数的功能就是x + 1 那么x就是一个值,那么这个值来源于numbers列表中的值。当我们使用map方法,第一个参数为function也就是函数,第二个参数为序列也可以理解为列表。 完全可以理解,将numbers列表中的值,一一的取到add函数中 最后通过x + 1的功能得出最后的结果。
map例2:
name = ("yankerp", "zhangsan", "lisi")
def upt(x):
return x.upper()
print(tuple(map(upt, name)))
>>> ('YANKERP', 'ZHANGSAN', 'LISI')
2.1、filter()
简单理解,filter就是一个过滤的意思,也就是添加一些筛选条件,从iterable的那些元素构造一个迭代器,函数返回true。iterable可以是序列,支持迭代的容器,也可以是迭代器。如果功能是None,同样的函数被假定,那就是,所有的元素迭代是假的被删除。filter
语法如下:
filter(function, iterable)
例如:我们在一个列表中有很多不同的数字。要求找到大于50 小于 70的数字。如下:
my_list = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16] # 定义一个数字列表
numbers = [] # 定义一个numbers空列表
for i in my_list: # 循环空列表的每一个值
if 50 < i < 70: # 附加判断条件
numbers.append(i) # 将条件成立的加入到新的列表中
print(numbers) # 最后输出结果
>>> [56, 67]
通过filter来实现:
my_list = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16] # 定义一个数字列表
def judge(x): # 定义一个judge函数,添加x参数
if 50 < x < 70: # 定义判断条件
return True # 若条件成立返回True 无找到就返回None
print(list(filter(judge, my_list))) # 输出最后的结果
>>> [56, 67]
filter例2:
name = ["yankerp", "yankai", "yanzan", "zhangsan", "lisi", "wangwu"]
import re
def seach(x):
if re.search("yan", x):
return True
print(list(filter(seach, name)))
>>> ['yankerp', 'yankai', 'yanzan']
3.1、reduce()
是减少 缩小 降低的意思,应用功能的两个参数来累计的项目序列,从左至右,这样的顺序,以减少单个值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])计算((((1+2)+3)+4)+5)
。左参数x是累加值,右参数y是序列的更新值。如果存在可选的初始值设定项,则它将位于计算中序列的项之前,并在序列为空时用作默认值。如果未给出初始化程序且序列仅包含一个项目,则返回第一个项目。
例如:目前有一个数字列表,需要把每个数字都+ - * / 如下:
from functools import reduce
numbers = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16]
Count = 0
for i in numbers:
Count+=i
print(Count)
>>> 405
reduce例1:
from functools import reduce
numbers = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16]
def add(x, y):
return x+y
reduce(add, numbers)
>>> 405
reduce例2:
from functools import reduce
numbers = ['a','b','x']
def add(x, y):
return x+y
reduce(add, numbers)
>>> 'abx'