2016-06-11 141 views
1

我試圖理解這些代碼行之間的區別:出瞭解Python的地圖功能+範圍

list(''.join(map(lambda x: str(x * 3), range(1, 4)))) 

['3', '6', '9']預期。

但是:

list(''.join(map(lambda x: str(x * 5), range(1, 4)))) 

輸出['5', '1', '0', '1', '5'],而我預計:['5','10','15']

以同樣的方式,

[x for x in map(lambda x: str(x * 5), range(1, 4))] 

。OUPUTS ['5','10','15']

這裏有什麼問題?

回答

9

你先加入所有的字符串連成一個大的字符串,然後轉換該字符串列表,它總是導致所有的單個字符被拉出的元素:

>>> list(map(lambda x: str(x * 5), range(1, 4))) 
['5', '10', '15'] 
>>> ''.join(map(lambda x: str(x * 5), range(1, 4))) 
'51015' 
>>> list(''.join(map(lambda x: str(x * 5), range(1, 4)))) 
['5', '1', '0', '1', '5'] 

,你可以見上面,所有你需要做的是去除str.join()通話,只需使用list()直接map()

list(map(lambda x: str(x * 5), range(1, 4))) 
2

所有數字在第一個片段是單位數字,所以加入他們並分開他們不會有什麼區別。見Martijn Pieters answer。在第二個它會有所作爲,因爲有些是兩位數字。

例子:

[3, 6, 9] join -> 369 split -> ["3", "6", "9"] 
[5, 10, 15] join -> 51015 split -> ["5", "1", "0", "1", "5"] 
+0

注:上的Martijn Pieters的海報刪除評論回答檢查編輯 –