reduce
reduce(function,sequence[,initital])
parameter:
-
function(带两个参数的函数,必需项)
-
sequence(元祖、字典、列表、字符串等可迭代对象,必需项)
-
inital(初始值,可选项)
概念:将可迭代的对象的前两个值a,b 传递到函数中,然后经过函数的处理返回的值c,再和可迭代的对象中的第三个值d 作为函数的两个参数( f(c,d) )传入函数中,以此类推
如果传入了 initial 值, 那么首先传的就不是 sequence 的第一个和第二个元素,而是 initial值和 第一个元素
举例1:将一个列表中所有元素组合成一个字符串
from functools import reduce str1 = ['a', 'b', 'c', 'd', 'e',2,1,3] str1 =[str(x) for x in str1] print(str1) def fun1(x,y): return x+y #不传入initial初始值 res = reduce(fun1,str1) print(res) #abcde213 #传入initial初始值 res = reduce(fun1,str1,'start') print(res) #startabcde213
举例2:将一个整数列表拼接成整数
res=reduce(lamba x,y:x*10+y ,[1,2,3,4,5]) print(res)#12345
举例3:对一个比较复杂的sequence进行reduce
#有一个元祖,元组内的每一个元素是字典,然后将字典中的这些age字段进行累加 dic = ({'name':'Alan Turing', 'age':18, 'gender':'male'}, {'name':'Dennis Ritchie', 'age':12, 'gender':'male'}, {'name':'Ada Lovelace', 'age':25, 'gender':'female'}, {'name':'Frances E. Allen', 'age':30, 'gender':'female'} ) #这么写会报错,因为元祖中第一个字典 和第二个字典传入x,y之后得到的是30,是一个整型,然后30作为参数x和元祖中的第三个元素执行函数逻辑 #整型没有['age'],所以报错 def fun(x,y): sum = x['age']+y['age'] return sum res = reduce(fun,dic) ##正确写法,写个初始值,然后每次函数运算出来的sum直接作为一个变量传递进去 ##当然这个例子只是一个举例 说明reduce的逻辑,如果要直接获取例中的age的和 直接可以用 #sum([x['age'] for x in dic]) def fun(x,y): sum = x + y['age'] return sum res = reduce(fun,dic,0) print(res)