我有2个等长列表,我试图得到它们的标量产品,但它不能这样工作:
sum(map(lambda a,b: a*b, zip(list1, list2)))
error: TypeError: <lambda>() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
即使这段代码不适合我的任务,有没有办法强制lambda在这种情况下使用元组?
我想做点什么
lambda x: (a,b)=x;a*b
Run Code Online (Sandbox Code Playgroud)
但它不适用于C风格的';' )
谢谢你的答案,还需要学习很多关于Python的东西)
Sin*_*ion 18
好吧,你不需要一个lambda ...
sum(a*b for a, b in zip(list1, list2))
Run Code Online (Sandbox Code Playgroud)
甚至zip()略微不完美......为了避免创建列表,要么使用python3,要么itertools.izip:
sum(a*b for a, b in itertools.izip(list1, list2))
Run Code Online (Sandbox Code Playgroud)
但是,如果出于一些疯狂的原因,你真的很想使用lambda,请将每个列表分别映射到:
sum(map(lambda a, b: a*b, list1, list2))
Run Code Online (Sandbox Code Playgroud)
即便如此,你也不需要lambda,operator模块中有一个可调用的产品:
sum(map(operator.mul, list1, list2))
Run Code Online (Sandbox Code Playgroud)
但在第一个或第二个例子中使用发生器,它通常会更快.
你可以简单地写
sum(a*b for a,b in zip(list1, list2))
Run Code Online (Sandbox Code Playgroud)
或正确使用地图:
sum(map(lambda (a,b): a*b, list1, list2))
Run Code Online (Sandbox Code Playgroud)
map拉链它的论点,实际上zip( .. )只是map(None, ..).
你也可以在Python2中调用函数时解包参数,但是在3中删除了这个不寻常的功能:
sum(map((lambda (a,b): a*b), zip(list1, list2)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11569 次 |
| 最近记录: |