2016-07-18 6 views
0

Hier ist mein Code:Iterieren mit Lambda und Karte Python

map(lambda i: 3*i, map(lambda x: x, [[1, 2],[3, 4]])) 

Es gibt: [[1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4]]

Wie kann ich es ändern 3, 6, 9, 12 drucken?

Ich möchte Append nicht verwenden. Nur Karte und Lambda.

Antwort

2

Das Problem, das Sie beobachten, ergibt sich aus der Tatsache, dass die innere map eine Sequenz von Listen, nicht eine Folge von Zahlen zurückgibt. Dies liegt daran, dass map über eine Liste mit kleineren Listen iteriert. Also, wenn Sie itertools.chain.from_iterable verwenden, um diese Liste zu reduzieren, erhalten Sie eine Folge von Zahlen. Sie können dann die äußere verwenden map sie

In [67]: L = [[1, 2],[3, 4]] 

In [68]: for i in map(lambda i: 3*i, itertools.chain.from_iterable(L)): print(i) 
3 
6 
9 
12 
1

Ihr Code, weil in Python wie erwartet nicht verdreifachen arbeiten die * Operator polymorph ist. Wenn also x und n Zahlen sind, gibt x*n das Produkt beider Zahlen zurück, aber wenn einer der Operanden (z. B. n) eine Ganzzahl und der andere eine Sequenz ist (.e. x ist eine Liste, ein Tupel oder eine Zeichenfolge) der Ausdruck x*n gibt die Sequenz zurück, die sich ergibt, wenn x mit sich selbst n mal verkettet wird. Beispiele:

>>> .1 * 2.5 
0.25 
>>> [1, 2] * 3 
[1, 2, 1, 2, 1, 2] 
>>> "beep" * 2 
beepbeep 

Um die erwartete zu erhalten führen Sie benötigen, um Ihre Liste zu glätten, bevor map() Anwendung:

>>> your_list = [[1, 2], [3, 4]] 
>>> flat_list = [item for sublist in your_list for item in sublist] 
>>> flat_list 
[1, 2, 3, 4] 
>>> triples = map(lambda x: 3*x, flat_list) 
>>> triples 
[3, 6, 9, 12] 

Eigentlich brauchen Sie nicht map() und lambda zu verwenden. Ich denke, mit einem One-Liner-Liste Verständnis würde mehr Python sein:

>>> triples = [3*item for sublist in your_list for item in sublist] 
>>> triples 
[3, 6, 9, 12]