2015-12-05 11 views
5

Ich bin sicher, es gibt einen Weg, dies zu tun, aber ich konnte es nicht finden. Sagen, ich habe:Entpacken verschachtelte Liste für Argumente zu map()

foo = [ 
    [1, 2], 
    [3, 4], 
    [5, 6] 
] 

def add(num1, num2): 
    return num1 + num2 

Dann, wie kann ich map(add, foo) so verwenden, dass es num1=1 spielt num2=2 für die erste Iteration, das heißt, es tut add(1, 2), dann add(3, 4) für die zweiten, usw.?

  • Der Versuch map(add, foo) tut offensichtlich add([1, 2], #nothing) für die erste Iteration
  • map(add, *foo) Versuch macht add(1, 3, 5) für die erste Iteration

Ich möchte so etwas wie map(add, foo)add(1, 2) auf der ersten Iteration zu tun.

Erwarteter Ausgang: [3, 7, 11]

+1

können Sie Ihre Frage, wie die Antworten überprüfen und, was Sie sagen, Sie wollen als erwartete Ausgabe nicht die gleiche –

Antwort

7

Es klingt wie Sie starmap brauchen:

>>> import itertools 
>>> list(itertools.starmap(add, foo)) 
[3, 7, 11] 

Dieses auspackt jedes Argument [a, b] aus der Liste foo für Sie, sie an die Funktion übergeben add. Wie bei allen Tools im Modul itertools wird ein Iterator zurückgegeben, den Sie mit der integrierten Funktion list verwenden können.

Aus den Dokumenten:

Anstelle von map() wenn Argumente Parameter bereits in Tupel aus einem einzigen iterable gruppiert sind (die Daten wurden „pre-Reißverschluss“). Der Unterschied zwischen map() und starmap() entspricht der Unterscheidung zwischen function(a,b) und function(*c).

+1

sind Wow, gut zu wissen . :) –

+0

nach dem Lesen der Frage scheint es, dass wir alle falsch sind, wie das OP will 'hinzufügen (1, 2'), dann' addieren (2, 3) '... es sei denn, das ist ein Fehler durch das OP –

+0

' [3, 7, 11] 'ist in der Tat das erwartete Ergebnis für mein Beispiel :) – binaryfunt

1

versuchen Sie dies:

foo = [ 
    [1, 2], 
    [3, 4], 
    [5, 6]] 

def add(num1, num2): 
     return num1 + num2 

print(map(lambda x: add(x[0], x[1]), foo)) 
+0

Das kann etwas schneller sein als die Antwort von ajcr – binaryfunt

0

Es gab eine andere Antwort mit einer perfekt gültigen Methode (wenn auch nicht so lesbar wie ajcr Antwort), aber aus irgendeinem Grunde es gelöscht wurde. Ich werde es reproduzieren, wie es für bestimmte Situationen nützlich sein kann

>>> map(add, *zip(*foo)) 
[3, 7, 11]