压缩对象上的python map()

nos*_*nos 7 python zip dictionary python-3.x

我有两个输入列表ab一个带两个输入的函数,比方说

def f(x, y): return x*y
Run Code Online (Sandbox Code Playgroud)

我如何使用map()此设置?我试过了

map(f, zip(a,b))
Run Code Online (Sandbox Code Playgroud)

得到了

TypeError:f()只需要2个参数(给定1个)

这很有意义,因为我需要解压缩压缩输入.我怎样才能做到这一点?

Kas*_*mvd 9

map不会将迭代器解压缩为函数参数,而是作为处理此类问题的更通用的方法,您可以使用模块中的starmap()函数,itertools而不是map()当参数参数已经从单个迭代中的元组中分组时:

from itertools import starmap

starmap(f, zip(a,b))
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

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]
Run Code Online (Sandbox Code Playgroud)

作为另一种选择,你可以将迭代物单独传递给它而不用压缩它们.

In [13]: list(map(mul, a, b))
Out[13]: [0, 6, 14, 24, 36]
Run Code Online (Sandbox Code Playgroud)

另外,作为两个变量相乘的更加pythonic方式,您可以使用operator.mul()而不是创建自定义函数:

In [9]: from operator import mul

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

这是基准:

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
Run Code Online (Sandbox Code Playgroud)