python减少错误?

时间:2009-11-17 06:37:30

标签: python lambda arguments reduce

以下是我的python代码:

>>> item = 1
>>> a = []
>>> a.append((1,2,3))
>>> a.append((7,2,4))
>>> sums=reduce(lambda x:abs(item-x[1]),a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 1 argument (2 given)
>>> 

我该如何解决? 谢谢!

3 个答案:

答案 0 :(得分:8)

你的lambda只接受一个参数,但reduce需要一个带两个参数的函数。让你的lambda有两个参数。

由于您没有说出您希望此代码执行的操作,我只想猜测:

the_sum=reduce(lambda x,y:abs(y[1]-x[1]),a)

答案 1 :(得分:3)

你的问题本身有点不清楚。无论如何,我只是假设 -

>>> a = []
>>> a.append((1,2,3))
>>> a.append((7,2,4))
>>> a
[(1, 2, 3), (7, 2, 4)] # list of tuples

我假设你可能有兴趣获得列表中所有元素的总和。如果这是问题那么可以通过两个步骤解决

1)第一步应该是压扁列表。

2)然后添加列表中的所有元素。

>>> new_list = [y for x in a for y in x] # List comprehension used to flatten the list
[1, 2, 3, 7, 2, 4] 
>>> sum(new_list)
19

一个班轮

>>> sum([y for x in a for y in x])
19

另一个假设,如果您的问题是减去列表中项目的元组的每个元素,那么使用它:

>>> [tuple(map(lambda y: abs(item - y), x)) for x in a]
[(0, 1, 2), (6, 1, 3)] # map function always returns a list so i have used tuple function to convert it into tuple.

如果问题不是其他问题,请详细说明。

PS:Python列表理解比其他任何东西都要好得多。

答案 2 :(得分:2)

reduce期望它被赋予的函数接受2个参数。对于iterable中的每个项目,它将传递当前项目的函数,以及函数的先前返回值。因此,获取列表的总和是reduce(lambda: x,y: x+y, l, 0)

如果我理解正确,要获得您尝试获得的行为,请将代码更改为:

a_sum = reduce(lambda x,y: x + abs(item-y[1]), a, 0)

但我可能会误解你想要得到什么。 更多信息在reduce函数的文档字符串中。