2012-03-21 75 views
4

我有2个等长的名单,我试图让他们的标量的产品,但它不会以这种方式工作:Python,如何在lambda中展开元组?

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中的许多事情)

+2

lambda x:x [0] * x [1] – Bwmat 2012-03-21 20:48:51

+0

哦,这太好了,ty mate!不知道我可以用[]来访问元组) – ShPavel 2012-03-21 20:50:37

回答

19

好,你不需要为这个拉姆达...

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

,但如果由于某种原因craaaaazy,你真的真的想用拉姆达,通过每个列表seperately映射:

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

即使如此,你并不需要一个lambda或者,一个可调用产品所述operator模块有:

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

但使用在第一或第二实施例的发电机,它通常会更快。

3

您可以使用operator模块(docs):

sum(map(lambda item: operator.mul(*item), zip(list1, list2))) 
5

你可以简单地写

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

或正确使用地图:

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

map确实压缩了它的参数,其实zip(..)只是map(None, ..)

您也可以解压参数当函数被调用Python2,但在3辗转这个不同寻常的特点:

sum(map((lambda (a,b): a*b), zip(list1, list2))) 
2
sum(x[0]*x[1] for x in zip(list1, list2)) 

列表解析和生成器表达式是正确的方法。

+2

这不是一个列表理解,但它是一个生成器表达式。 – 2012-03-21 20:55:20

1

回答OP关于lambda通过zip接受多个参数的原始问题。

您需要使用的括号lambda参数,就像这样:

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

测试在Python 2.7版

+2

虽然这是Python 3中的语法错误。 – 2017-01-26 10:21:47

+0

感谢您指出。我应该指定。 – 2017-01-26 21:12:51

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

元组只是一个清单的正常元素,以便

x <- {tuples...} 

因此,x可以像其他任何分配的元组变量一样被当作普通元组(x1,x2,x..,xk)