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

5

我有两个等长的列表,想要对它们进行标量乘积运算,但是这样做行不通:

sum(map(lambda a,b: a*b, zip(list1, list2)))

error: TypeError: <lambda>() takes exactly 2 arguments (1 given)

即使这段代码不适用于我的任务,是否有办法强制lambda处理元组以满足此类情况?我想要做类似以下的操作:
lambda x: (a,b)=x;a*b 

但如果使用C风格的 ';',它将无法工作。
谢谢回答,还需要学习许多关于Python的知识。
6个回答

19

好的,针对这个问题你不需要使用 lambda 表达式...

sum(a*b for a, b in zip(list1, list2))

即使 zip() 稍微有些不完美……为了避免创建列表,可以使用 Python3,或者使用itertools.izip

sum(a*b for a, b in itertools.izip(list1, list2))

但是,如果出于某些疯狂的原因,您真的非常想使用 lambda,请将每个列表分别传递给 map:

sum(map(lambda a, b: a*b, list1, list2))

即使这样,您也不需要使用lambda表达式,因为operator模块中提供了一个可调用的乘积函数:

sum(map(operator.mul, list1, list2))

但是在第一个或第二个示例中使用生成器通常会更快。


5

你可以简单地写

sum(a*b for a,b in zip(list1, list2))

或者正确使用 map:

sum(map(lambda (a,b): a*b, list1, list2))

map函数会将它的参数压缩在一起,实际上zip(..)就是map(None, ..)

在Python2中,你还可以在调用函数时解包参数,但这个不寻常的特性在Python3中被移除了。

sum(map((lambda (a,b): a*b), zip(list1, list2)))

3
您可以使用operator模块(文档):
 sum(map(lambda item: operator.mul(*item), zip(list1, list2)))

2
sum(x[0]*x[1] for x in zip(list1, list2))

列表推导式和生成器表达式是正确的方法。

2
那不是列表推导式,而是生成器表达式。 - Thomas Wouters

2

回答原问题,关于lambda如何通过zip接受多个参数。

你需要在lambda参数周围使用括号,像这样:

sum(map(lambda (a,b): a*b, zip(list1, list2)))

在Python 2.7上测试通过。


0
(lambda x:  x[0] == ... and x[1] != ..... , mylistoftuples )

元组只是列表中的一个普通元素,因此

x <- {tuples...}

所以,x 可以像任何其他已分配的元组变量一样被视为普通元组(x1,x2,x..,xk)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接