python中的map,feilter,和reduce函数
map()
map()的原型是map(function, iterable, …)
-
参数 function: 传的是一个函数名,可以是python内置的,也可以是自定义的。 就像上面的匿名函数lambda
-
参数 iterable: 传的是一个可以迭代的对象,例如列表,元组,字符串这样的。
-
返回值是一个map对象,其实质就是一个迭代器。
这个函数的意思就是将function应用于iterable的每一个元素,结果以列表的形式返回(其实是迭代器)。注意到没有,iterable后面还有省略号,意思就是可以传很多个iterable,如果有额外的iterable参数,并行的从这些参数中取元素,并调用function。如果一个iterable参数比另外的iterable参数要短,将长iterable剩下的元素扔掉。
例子:将列表中的int型元素转换成字符串型
a=[1,2,3,4,5]
la=map(str,a)
print(la)
print(list(la)) #使用list方法将迭代器转化成列表
输出:
<map object at 0x000002C09F758278>
['1', '2', '3', '4', '5']
例子:将两个等长列表合并
"""
如果两个列表不等长,map会以最短的列表为准,将长列表剩下的元素扔掉,如果想以长列表为准的话
"""
a = [1, 2, 3, 4, 5]
b = [1, 2, 3, 4, 5]
res = map(lambda x, y: x + y, a, b)
print(list(res))
输出:
[2, 4, 6, 8, 10]
如果两个列表不等长,map会以最短的列表为准,将长列表剩下的元素扔掉,
如果不想丢弃长列表剩下的元素,想以长列表为准的话,请点击以下链接
https://blog.csdn.net/weixin_43250623/article/details/93409418
reduce()
reduce
函数接收两个参数,一个是函数,一个是Iterable
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是:
from functools import reduce
# 从某个版本开始reduce不再作为内置函数存在,而是放在了functools模块中
def f1(x, y):
return x + y
a = [1, 2, 3, 4, 5]
res = reduce(f1, a)
print(res)
输出:
# 15
如果要把序列[1, 3, 5, 7, 9]
变换成整数13579
,reduce
就可以派上用场:
def fn(x, y):
return x * 10 + y
res = reduce(fn, [1, 3, 5, 7, 9])
print(res)
输出:
# 13579
filter()
filter函数用于过滤序列。
filter()函数包含2个参数,一个是过滤函数,另一个是过滤序列。
返回值是一个可迭代对象
filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
下面用一个例子:
删除1-100中素数
L = range(1, 101)
def isprimer(n):
flag = 1
for i in range(2, n):
if n % i == 0:
flag = 0
if flag == 0:
return n
res = filter(isprimer, L)
print(res) # 输出来是一个filter对象,其实质是一个迭代器
print(list(res))
输出:
<filter object at 0x0000020B7AC583C8>
[4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64, 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 98, 99, 100]