2016-12-01 2 views
1

У меня есть два входа списки a и b и функцию, которая принимает два входа, скажемпитон карта() на архивный объект

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

Как использовать map() для этой установки? Я попытался

map(f, zip(a,b)) 

и получил

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

Это имеет смысл, потому что мне нужно распаковать архивный ввода. Как я могу это сделать?

+3

'карта (е , a, b). –

+0

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

ответ

3

map не распаковывать итерируемых как ваш аргумент функции, а как более общий способ для решения таких проблем, которые вы можете использовать функцию starmap() из itertools модуля, который должен быть использован вместо map() когда параметры аргумента уже сгруппированы в кортежи из одного Iterable:

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] 

Кроме того, как более вещий способ для умножения двух переменных можно использовать 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