python:filter、lambda和map、reduce

来源:互联网 发布:68.168.16.158现在域名 编辑:程序博客网 时间:2024/05/19 12:39

小问题:去除列表mylist=['A','B','','C',None,'D']中的空字符

暴力解决:

for item in mylist:    if item=="" or item==None:        del item
委婉解决:filter+lambda

newlist = list(filter(lambda x: x, mylist))
最佳解决: filter+ not_empty

newlist = list(filter(not_empty, mylist))

小知识:map、reduce、filter

map()可以对多个序列的每个元素都执行相同的操作,并组成列表返回,声明如下:
map(func, sequence[, sequence,...]) -> list
4.1 参数func是自定义的函数,实现对序列每个元素的操作
4.2 参数sequence为待处理的序列,可以有多个序列
4.3 map()的返回值是对序列元素处理后的列表

a = [1, 2, 3, 4, 5]

def foo(x):

    return 3 * x

map(foo, a) #[3, 6, 9, 12, 15] 

reduce(function,sequence)
function接收的参数个数只能为2
先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给
function,然后只返回一个结果。
例子:
求1到10的累加
reduce(lambda x,y:x+y,range(1,11))
返回值是55。

题目:求下列函数的输出

from functools import reducedef fn(x, y):return x*10+yr = reduce(fn, [1,2,3,4])print(r)
python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。

1*10+2=12

12*10+3=123

123*10+4=1234

最终结果:1234

filter()可以对某个序列做过滤处理,对自定义函数的参数返回的结果是否为“真”来过滤,并一次性返回处理结果。
声明如下:
filter(func or None, sequence) -> list, tuple, or string
2.1 参数func是自定义的过滤函数,在函数func(item)中定义过滤的规则。如果func为None,则过滤项都为真,返回所有的序列元素。
2.2 参数sequence为待处理的序列
2.3 filter()的返回值是由func()的返回值组成的序列,返回的类型与参数sequence的类型相同
2.4 filter()的过滤函数func()的参数不能为空
filter函数以一个函数和序列作为参数,它返回该序列的子集,其中子集的成员能满足函数的条件。
如果filter以None作为第一个参数,它将过滤掉序列中所有假值 

0 0