python高阶函数 map、filter、reduce详解,附例子

目录

map

filter

reduce

 


 map

接受一个函数,以及一个或多个集合序列,会根据提供的函数对指定序列做映射,然后返回一个新的集合序列。

map(func,seq[,seq[,seq...]]) -> list
# 返回map object,可以转成list

一个列表对映一个列表的集合映射

例一、如何将列表中的值平方后组成新列表

将list = [1,2,3,4,5] 转换成平方后的结果 list2 = [1,4,9,16,25]

def f_square(x):
    return x**2

li = [1,2,3,4,5]
li2 = map(f_square,li)
print(list(li2))

用匿名函数lambda方式去写会更简单,如果对lambda用法不熟悉的参考之前的Python lambda表达式的文章

li2 = list(map(lambda x:x**2,li))

 

多个列表对映一个列表的集合映射,几个列表对于就有几个参数

例二、如何利用[5,8,4],[6,9,11] 组成 x+y 新列表:[11,17,15]

res = list(map(lambda x,y:x+y,[1,2,3],[4,5,6]))

filter

用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的filter对象。序列可以是list、tuple和string。

方法func中返回的是一个bool值,判断是否需要保留。如果是true则保留,false则过滤掉。

filter(func,seq) -> list or tuple 
# 过滤,得到filter object,可以强转的列表

对列表进行过滤处理:

例三、1-50的数字中,提取能被3整除的元素。

res = list(filter(lambda x:x%3==0,range(1,51)))#能被3整除的数

对字符串过滤处理:

例四、对字符串“abcabcabc”过滤掉字母b。

li3 = list(filter(lambda x:x!='b','abcabcabc'))
s = "".join(li3)
print(s)

reduce

对于序列中的所有元素,调用func进行数据合并操作,通过顺序迭代操作运算,返回最终的计算值。可以给定一个初始值。

python 3中reduce模块已经被移到functools 模块了,调用reduce需要先引入此模块。

reduce(func,seq[,initvalue])

 先来看个例子,如何求5的阶乘,5! = 1*2*3*4*5。

fac = functools.reduce(lambda x,y:x*y,range(1,6))
print(fac)

reduce函数的运行过程,没有初始值,函数默认值x=1,y=2,然后执行func的运算,结果返回给x,x=2。接着开始迭代y=3,执行func,x=2*3结果是6;下一步y取4,执行func返回给x,x=6*4结果是24;下一步y取5,执行func返回给x,x=24*5结果是120。函数迭代完成,返回最终结果120给调用者。

如果函数有初始值:reduce(lambda x,y:x*y,range(1,6),100),初始时x=100,y=1,最终的执行顺序((((100*1)*2)*3)*4)*5。初始值会被放到运算规则的最前面,然后在依次和序列进行顺序运算,返回最终结果。

 

例四、求下列序列中的age的总和。

[
    ('Jeo', 11, 'man'),     # name,age,sex
    ('Susan', 22, 'woman'), 
    ('Herry', 33, 'man'), 
    ('Balck', 44, 'man')
]

你是否是这么写的:

import functools
li4 = [
    ('Jeo', 11, 'man'),
    ('Susan', 22, 'woman'),
    ('Herry', 33, 'man'),
    ('Balck', 44, 'man')
]

age_sum = functools.reduce(lambda x,y:x[1]+y[1],li4)

如果模仿之前的例子,直接用下角标去访问相加的话,程序会报错   TypeError: 'int' object is not subscriptable。

为什么呢,看下程序执行过程:

1、初始化,函数没有给默认值,x=('Jeo', 11, 'man'),y=('Susan', 22, 'woman');

2、根据func运算,结果返回给x,x=x[1]+y[1],结果是11+22=33;

3、逻辑迭代运算,下一个值给y,y=('Herry', 33, 'man');x=x[1]+y[1],到这步骤的时候x=33,取值x[1]的是程序报错,x是整数已经不再是一个元祖列表了。

 

怎么改正呢?

引入初始值,让x初始化为0,修正运算规则x[1]+[y1]  —》 x+y[1],这样子就能保住每次x都是一个整数,运算就不会出错。

import functools
li4 = [
    ('Jeo', 11, 'man'),
    ('Susan', 22, 'woman'),
    ('Herry', 33, 'man'),
    ('Balck', 44, 'man')
]

age_sum = functools.reduce(lambda x,y:x+y[1],li4,0)

print(age_sum)

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值