2016-07-28 6 views
0

Ich habe zwei Listen: a=[1,2,3], b=[a,b,c]Wie ruft man für jede Iteration einer Zip von zwei Listen eine Funktion auf?

Ich möchte für jeden zip der beiden letztgenannten eine Funktion aufzurufen, aber nicht in trivialer Weise innerhalb einer for-Schleife zu tun. Gibt es einen pythonischen Weg? Ich habe versucht, mit einem map:

map(func(i,v) for i,v in zip(a,b))

aber nicht

+2

* es funktioniert nicht * Wie ist das so? Bitte zeigen Sie die Ergebnisse von dem, was Sie versucht haben –

+2

und warum diese Ergebnisse Sie nicht zufriedenstellen (was ist Ihre erwartete Ausgabe/Verhalten) –

+1

Um Karte zu verwenden, würden Sie nur 'map (func, a, b)' angeben. Oder Sie können verwenden, was Sie oben in einem Listenverständnis geschrieben haben. Aber wenn Sie nicht die Ergebnisse Ihrer Funktion sammeln möchten, wird eine for-Schleife genauso schnell und expliziter über Ihre Absichten sein. –

Antwort

0

Wenn die Funktion func gibt nichts zurück, könnten Sie verwenden:

any(func(i, v) for i,v in zip(a, b)) 

Welche False zurückkehren wird, aber nicht die Ergebnisse akkumulieren.

Dies würde nicht als "Pythonic" von vielen seit any() wird für seine Nebenwirkungen verwendet werden, und ist daher nicht sehr explizit.

1

Eine Liste Verständnis zu map ist funktioniert fast immer schneller oder gleichwertig. Wenn Sie die Ergebnisse des Verstehens auf eine Liste (wie im Beispiel) anhängen, dann ein Verständnis ist auch schneller als ein for loop:

a = [1, 2, 3] 
b = ['a', 'b', 'c'] 
c = [] 

def foo(x, y): 
    global c 
    result = x * y 
    c.append(result) 
    return result 


>>> c 
[] 

>>> [foo(x, y) for x, y in zip(a, b)] 
['a', 'bb', 'ccc'] 

>>> c 
['a', 'bb', 'ccc'] 
+1

Die Funktion gibt nichts zurück, Es funktioniert Dateimanipulation – curious

+0

@curious Ich sehe keine Dateien hier. Und die Funktion gibt tatsächlich einen Wert zurück. –

+0

Meine Funktion Ich meine nichts zurück. Es macht etwas mit Dateien. Warum also ein Listenverständnis verwenden? – curious

5

Der pythonic Weg ist die for-Schleife:

for i, v in zip(a, b): 
    func(i, v) 

Klar, prägnant, lesbar. Was ist nicht zu mögen?