nos*_*nos 7 python zip dictionary python-3.x
我有两个输入列表a和b一个带两个输入的函数,比方说
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个)
这很有意义,因为我需要解压缩压缩输入.我怎样才能做到这一点?
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)
| 归档时间: |
|
| 查看次数: |
2940 次 |
| 最近记录: |