map,filter, reduce, zip都是针对python中的sequence数据类型的内置方法。
一、map
map(func, *iterables)
先来看看map函数,接收两个参数,第一个是函数,第二个是序列(可迭代对象),map的作用是将序列中的每一个元素传入函数中,并将返回结果加入新列表。
例:
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam‘, ‘LISA‘, ‘barT‘],输出:[‘Adam‘, ‘Lisa‘, ‘Bart‘]。
def trans(x): return x.capitalize() print(list(map(trans, [‘adam‘, ‘LISA‘, ‘barT‘]))) # [‘Adam‘, ‘Lisa‘, ‘Bart‘]
也可以用匿名函数,同样可以得到相同的结果:
print(list(map(lambda x: x.capitalize(), [‘adam‘, ‘LISA‘, ‘barT‘]))) # [‘Adam‘, ‘Lisa‘, ‘Bart‘]
当然,不用map,使用列表推到式也没问题:
print([x.capitalize() for x in [‘adam‘, ‘LISA‘, ‘barT‘]]) # [‘Adam‘, ‘Lisa‘, ‘Bart‘]
二、reduce
reduce(function, sequence)
reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果是这样哒:
reduce(f, [x1, x2, x3, x4]) <--> f(f(f(x1, x2), x3), x4)
注意:在Python3中reduce需要导入
from functools import reduce
例1:
将一个列表中的每个元素自加3,然后对列表中的元素求和。
最简单的方式,用sum和列表推导式就可以完成:
li = [1, 2, 3, 4, 5, 6] print(sum([x + 3 for x in li])) # 39
或者:
li = [1, 2, 3, 4, 5, 6] print(reduce(lambda x, y: x + y, [x + 3 for x in li])) # 39
例2:
Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积。
def prod(li): return reduce(lambda x, y: x * y, li) print(prod([1,2,3,4])) # 24
或者:
print(reduce(lambda x, y: x * y, [1, 2, 3, 4])) # 24
三、zip
zip(iter1 [,iter2 [...]])
zip函数会对每个sequence对象依次取相同索引的值到一个tuple中,然后返回一个由这些tuple组成的列表。tuple的数量由所有sequence中具有最少索引的那个sequence决定,该sequence取值完毕后便不再继续对剩余的sequence取值。
>>> zip([1,2,3,4],[2,3,4,5]) [(1, 2), (2, 3), (3, 4), (4, 5)] >>> zip([1,2,3,4], (2,3,4,5,6,7)) [(1, 2), (2, 3), (3, 4), (4, 5)] >>> zip([1,2,3,4], [[2,3,4],[2,3]]) [(1, [2, 3, 4]), (2, [2, 3])]
四、filter
filter(function or None, iterable)
filter的工作原理是使用第一个参数对象(function或者None)来对第二参数对象iterable进行运算,并根据运算结果的布尔值来过滤iterable中的元素。
对function返回值的布尔运算,如果为True,则将当前元素存储到string, tuple或者list中并最终返回对应类型的对象;如果为False,则将当前元素过滤掉,如果function没有返回值,则视为返回None,因此所有元素都会被过滤掉。如果第一个参数不是function而是None,则返回iterable中所有为True的元素。
>>> filter(lambda d: d != ‘a‘, ‘abcd‘) # 过滤掉了字母‘a‘。 ‘bcd‘
-----------------------------------------------------------------------------------------------------------