列表生成式+过滤器(filter)+映射(map)+lambda总结

列表生成式+过滤器(filter)+映射(map)+lambda总结

这些都是python的特色,不仅强大,而且好用,配合起来使用更是无敌。

  • lambda

lambda用于产生一个匿名表达式,组成部分为:lambda + ‘函数表达式’ ‘函数表达式’由一个冒号加上两个‘操作数’组成,如:

lambda x:x*3

冒号左边的操作数,作为函数的参数;冒号右边的作为函数的放回值!
那么lambda x:x*3就等价于:

def func(x):  
  return x*3
  • 列表生成式

列表生成器,可以由3个部分组成,这3个从左到右的顺序是:

1、表达式部分:一般为一个表达式作用一个列表的元素;或者就该元素,不作用任何表达式 、
2、列表生成部分:一般为一个for循环产生初始列表,并依次导出元素
3、过滤部分:一般由一个if判断构成,条件为假的过滤掉。这个部分可选。
总结一下列表生成器就是:
[表达式部分 列表生成部分 过滤部分(可选)]#注意三个部分之间空格隔开即可
例子:

[ str(i) for i in range(1, 100) if not(i%3)]

这个理解顺序过程是:
首先由列表生成部分:for i in range(1, 100)逐一产生列表的元素,
每个 元素经过过滤部分:if not(i%3)检测,判断为假的直接丢弃,
判断为真的再交给表达式部分:str(i) 进行处理得到新列表的元素。
这个流程直到for结束循环,新列表生成。

  • 过滤器(filter)

过滤器有两个参数:function类型,序列
1、序列是将被筛选的原始集合,function类型是制定筛选的规则(公式)。
2、function类型如果返回None,或者说就是None,则序列中为值为假的将被过滤,如:

filter(None,(0,0,False,11,True,1,123)),就会过滤剩下[11, True, 1, 123]

注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

 list(filter(None,(0,0,False,11,True,1,123)))

[11, True, 1, 123]

3、当function类型是一个函数时,filter会将序列中每个元素带入函数,函数返回 假的元素被剔除,
如:

 list(filter(lambda x:not x%2,[x for x in range(10)]))

[0, 2, 4, 6, 8]

4、如果筛选的规则不复杂的话,列表生成式完全可以代替他:

[x for x in range(10) if(not x%2)]
  • 映射(map)

1、和filter类似,不过这次不是过滤,而是映射:把一个序列映射成另一个序列,映射规则由一个函数制定。 2、同样map也有两个参数:function类型,序列,如:

map(lambda x:x**2,range(10))

这样序列[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]就被映射成了[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

注意到map()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

 list(map(lambda x:x**2,range(10)))

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

4、如果筛选的规则不复杂的话,列表生成式完全可以代替他:

[x**2 for x in range(10)]

总结:

1、filter和lambda结合,可以方便的筛选一个序列。

2、map和lambda结合,可以方便的映射出新的序列。

3、如果筛选/映射规则比较简单,可以直接用列表生成式代替,更加方便。

4、他们其实都可以各自结合,产生巨大爆发力。

示例解析:

s=["sum(i[1])","reduce(lambda acc,q:acc-q[1] if q[0]%2 else acc+q[1],enumerate(i[1]),0)","len(i[1])","sum(i[1])/len(i[1])","max(i[1])"]
group=list(filter(lambda x:x%2==0 or x%5,map(int,input().split()[1:])))
ll=[eval(s[i[0]]) if len(i[1]) else "N"  for i in enumerate([[t for t in group if t%5==i] for i in range(5)])]
print(ll[0],ll[1],ll[2],ll[3] if ll[3]=='N' else "{:.1f}".format(ll[3]),ll[4],sep=" ")

第一行定义一个列表:
s[0]的sum()函数用于求和,计算能被 5 整除的数字中所有偶数的和;
s[1]通过reduce()函数对参数序列中元素进行累积。 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2 +n3−n4 ⋯;
s[2]通过len()函数来统计 被 5 除后余 2 的数字的个数;
s[3]用于计算被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
s[4]通过max()函数来得到 被 5 除后余 4 的数字中最大数字。
第二行用于输入;
第三行新建一个列表来方便输出:
eval()函数用来执行一个字符串表达式,并返回表达式的值。

出处:http://www.cnblogs.com/douzi2/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值