2016-12-01 4 views
1

Ich habe zwei Eingänge listet a und b und eine Funktion, die zwei Eingänge nimmt, sagen wir mal,Python Karte() auf RV-Objekt

def f(x, y): return x*y 

Wie verwende ich map() für dieses Setup? Ich habe versucht,

map(f, zip(a,b)) 

und bekam

TypeError: f() takes exactly 2 arguments (1 given)

Es macht Sinn, weil ich die gezippte Eingang auspacken müssen. Wie kann ich das machen?

+3

'Karte (f , a, b) '. –

+0

'def f (x): Rückgabe x [0] * x [1]' – furas

Antwort

3

map nicht die Iterables als Funktionsargument auspacken, sondern als allgemeine Art und Weise mit solchen Problemen zu tun haben können Sie starmap() Funktion von itertools Modul verwenden, die anstelle von map() verwendet werden sollen, wenn Argument Parameter bereits in gruppiert sind Tupel aus einem einzigen iterable:

from itertools import starmap 

starmap(f, zip(a,b)) 

Hier ist ein Beispiel:

In [2]: a = range(5) 

In [3]: b = range(5, 10) 

In [7]: from itertools import starmap 

In [8]: list(starmap(f, zip(a,b))) 
Out[8]: [0, 6, 14, 24, 36] 

Als weitere Option kann Sie nur die iterab passiert les separat zu kartografieren, ohne sie zu zippen.

In [13]: list(map(mul, a, b)) 
Out[13]: [0, 6, 14, 24, 36] 

Auch als mehr pythonic Art und Weise zwei Variable zum Multiplizieren Sie operator.mul() statt Erstellen einer benutzerdefinierten Funktion verwenden können:

In [9]: from operator import mul 

In [10]: list(starmap(mul, zip(a,b))) 
Out[10]: [0, 6, 14, 24, 36] 

Hier ist der Maßstab:

In [11]: %timeit list(starmap(mul, zip(a,b))) 
1000000 loops, best of 3: 838 ns per loop 

In [12]: %timeit list(starmap(f, zip(a,b))) 
1000000 loops, best of 3: 1.05 µs per loop