4

以下是我的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)
>>> 

我该如何解决?谢谢!

4

3 回答 3

8

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

既然你没有说你想让这段代码做什么,我只是猜测:

the_sum=reduce(lambda x,y:abs(y[1]-x[1]),a)
于 2009-11-17T06:42:49.973 回答
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 列表理解比其他任何东西都要好和高效。

于 2009-11-17T08:14:46.153 回答
2

reduce期望给它的函数接受 2 个参数。对于可迭代对象中的每个项目,它将向函数传递当前项目,以及函数的前一个返回值。所以,得到一个列表的总和是reduce(lambda: x,y: x+y, l, 0)

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

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

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

于 2009-11-17T06:59:15.613 回答