2016-06-11 9 views
1

Ich versuche, den Unterschied zwischen diesen Zeilen Code zu verstehen:Verständnis Python Map-Funktion + Bereich

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

Out: ['3', '6', '9'] wie erwartet.

jedoch:

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

Ausgänge ['5', '1', '0', '1', '5'], während ich erwartet hatte: ['5','10','15']

In der gleichen Weise, dass

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

ouputs ['5','10','15'].

Was ist hier falsch?

Antwort

9

Sie zuerst verbunden alle Saiten zusammen in eine große Zeichenfolge, und konvertiert dann diese Zeichenfolge in eine Liste, die immer zu allen einzelnen Zeichen werden als Elemente herausgezogen:

>>> 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'] 

Wie Sie können siehe oben, alles, was Sie tun müssen, ist entfernen Sie den str.join() Anruf, benutzen Sie einfach list() direkt auf map():

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

alle Zahlen in der ersten Schnipsel sind einziffrige Ziffern, so dass es keinen Unterschied macht, sie zu verbinden und aufzuteilen. Siehe Martijn Pieters answer. In der zweiten wird es einen Unterschied machen, weil einige zweistellige Zahlen sind.

Beispiel:

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

Hinweis: Poster entfernt Kommentar zu Martijn Pieters beantworten die Bearbeitung überprüfen –