***將元組轉換成list*** >>> map(int, (1,2,3)) [1, 2, 3] ***將字符串轉換成list*** >>> map(int, '1234') [1, 2, 3, 4] ***提取字典的key,並將結果存放在一個list中*** >>> map(int, {1:2,2:3,3:4}) [1, 2, 3] ***字符串轉換成元組,並將結果以列表的形式返回*** >>> map(tuple, 'agdf') [('a',), ('g',), ('d',), ('f',)] #將小寫轉成大寫 def u_to_l (s): return s.upper() print map(u_to_l,'asdfd')
python map函數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
map
()函數
map
()是 Python 內置的高階函數,它接收一個函數 f 和一個
list
,並通過把函數 f 依次作用在
list
的每個元素上,得到一個新的
list
並返回。
例如,對於
list
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
]
如果希望把
list
的每個元素都作平方,就可以用
map
()函數:
因此,我們只需要傳入函數f(x)
=
x
*
x,就可以利用
map
()函數完成這個計算:
def
f(x):
return
x
*
x
print
map
(f, [
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
])
輸出結果:
[
1
,
4
,
9
,
10
,
25
,
36
,
49
,
64
,
81
]
注意:
map
()函數不改變原有的
list
,而是返回一個新的
list
。
利用
map
()函數,可以把一個
list
轉換為另一個
list
,只需要傳入轉換函數。
由於
list
包含的元素可以是任何類型,因此,
map
() 不僅僅可以處理只包含數值的
list
,事實上它可以處理包含任意類型的
list
,只要傳入的函數f可以處理這種數據類型。
任務
假設用戶輸入的英文名字不規范,沒有按照首字母大寫,后續字母小寫的規則,請利用
map
()函數,把一個
list
(包含若干不規范的英文名字)變成一個包含規范英文名字的
list
:
輸入:[
'adam'
,
'LISA'
,
'barT'
]
輸出:[
'Adam'
,
'Lisa'
,
'Bart'
]
def
format_name(s):
s1
=
s[
0
:
1
].upper()
+
s[
1
:].lower();
return
s1;
print
map
(format_name, [
'adam'
,
'LISA'
,
'barT'
])
|
map()函數是python內置的高階函數,對傳入的list的每一個元素進行映射,返回一個新的映射之后的list
Python map()函數的用法
Python函數式編程之map()
Python中map()、filter()、reduce()這三個都是應用於序列的內置函數。
格式:
1
|
map
(func, seq1[, seq2,…])
|
第一個參數接受一個函數名,后面的參數接受一個或多個可迭代的序列,返回的是一個集合。
Python函數編程中的map()函數是將func作用於seq中的每一個元素,並將所有的調用的結果作為一個list返回。如果func為None,作用同zip()。
1、當seq只有一個時,將函數func作用於這個seq的每個元素上,並得到一個新的seq。
讓我們來看一下只有一個seq的時候,map()函數是如何工作的。
從上圖可以看出,函數func函數會作用於seq中的每個元素,得到func(seq[n])組成的列表。下面舉得例子來幫助我們更好的理解這個工作過程。
1
2
3
|
#使用lambda
>>>
print
map
(
lambda
x: x
%
2
,
range
(
7
))
[
0
,
1
,
0
,
1
,
0
,
1
,
0
]
|
1
2
3
|
#使用列表解析
>>>
print
[x
%
2
for
x
in
range
(
7
)]
[
0
,
1
,
0
,
1
,
0
,
1
,
0
]
|
一個seq時,可以使用filter()函數代替,那什么情況不能代替呢?
2、當seq多於一個時,map可以並行(注意是並行)地對每個seq執行如下圖所示的過程:
從圖可以看出,每個seq的同一位置的元素同時傳入一個多元的func函數之后,得到一個返回值,並將這個返回值存放在一個列表中。下面我們看一個有多個seq的例子:
1
2
|
>>>
print
map
(
lambda
x , y : x
*
*
y, [
2
,
4
,
6
],[
3
,
2
,
1
])
[
8
,
16
,
6
]
|
如果上面我們不使用map函數,就只能使用for循環,依次對每個位置的元素調用該函數去執行。還可以使返回值是一個元組。如:
1
2
|
>>>
print
map
(
lambda
x , y : (x
*
*
y, x
+
y), [
2
,
4
,
6
],[
3
,
2
,
1
])
[(
8
,
5
), (
16
,
6
), (
6
,
7
)]
|
當func函數時None時,這就同zip()函數了,並且zip()開始取代這個了,目的是將多個列表相同位置的元素歸並到一個元組。如:
1
2
|
>>>
print
map
(
None
, [
2
,
4
,
6
],[
3
,
2
,
1
])
[(
2
,
3
), (
4
,
2
), (
6
,
1
)]
|
需要注意的是:
map無法處理seq長度不一致、對應位置操作數類型不一致的情況,這兩種情況都會報類型錯誤。如下圖:
import time
from datetime import datetime
def add(x, y):
print(datetime.now(), "enter add func...")
time.sleep(2)
print(datetime.now(), "leave add func...")
return x+y
map(add, [1,2,3], [4,5,6])
2016-04-05 15:01:49.382314 enter add func...
2016-04-05 15:01:51.383387 leave add func...
2016-04-05 15:01:51.383471 enter add func...
2016-04-05 15:01:53.385584 leave add func...
2016-04-05 15:01:53.385676 enter add func...
2016-04-05 15:01:55.387388 leave add func...
[5, 7, 9]