以下是我的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)
>>>
我该如何解决? 谢谢!
答案 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
函数的文档字符串中。