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)
原文地址:https://www.cnblogs.com/alantammm/p/13949092.html