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]