Python,如何在lambda中展开元组?

ShP*_*vel 4 python lambda

我有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)

但在第一个或第二个例子中使用发生器,它通常会更快.


Joc*_*zel 5

你可以简单地写

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)