2016-12-01 59 views
1

上我有兩個輸入列出ab和這需要兩個輸入的功能,比方說蟒圖()壓縮對象

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

如何使用map()這種設置的?我試圖

map(f, zip(a,b)) 

,並得到

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

這是有道理的,因爲我需要解壓壓縮的輸入。我怎樣才能做到這一點?

+3

'圖(F ,a,b)'。 –

+0

'def f(x):return x [0] * x [1]' – furas

回答

3

map不解開iterables作爲函數的參數,而是作爲處理此類問題更普遍的方式,可以使用starmap()功能從itertools模塊時參數參數已分組應該被用來代替map()從單一的迭代元組:

from itertools import starmap 

starmap(f, zip(a,b)) 

下面是一個例子:

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] 

作爲另一種選擇你可以只通過iterab les分開映射而不用壓縮它們。

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

而且作爲乘以兩個可變更Python的方式,你可以使用operator.mul(),而不是創建一個自定義函數:

In [9]: from operator import mul 

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

這裏是基準:

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