我有两个输入列表a
和b
以及一个带两个输入的函数,比方说
def f(x, y): return x*y
如何使用map()
进行此设置?我试过了
map(f, zip(a,b))
得到了
TypeError:f()只需要2个参数(给定1个)
这很有意义,因为我需要解压缩压缩输入。我怎么能这样做?
答案 0 :(得分:9)
map
并不将迭代器解包为函数参数,而是作为处理此类问题的更通用方法,您可以使用itertools
模块中的starmap()
函数。当参数参数已经从一个可迭代的元组中分组时,应该使用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]
以下是一个例子:
In [13]: list(map(mul, a, b))
Out[13]: [0, 6, 14, 24, 36]
作为另一种选择,你可以将迭代物分别传递给它而不用压缩它们。
operator.mul()
另外,作为两个变量相乘的更加pythonic的方法,您可以使用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
以下是基准:
Slick.definePseudo('in-fold', function(){
var isInFold = false;
// code to determine if the element is visible in the viewport
return isInFold;
});
答案 1 :(得分:0)
您可以使用 lambda 函数来处理以下情况:
Map(lambda (x,z): function(x,z), zip(listA, listB))
我知道这是一篇旧文章,但将来可能会对其他人有所帮助。
PD:对不起,我打来的电话打错了。