Python缩减函数出错?

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

如何解决这个问题?谢谢!

1
请注意,sum是Python中的内置函数,因此建议您使用不同的名称,就像我在我的答案中所做的那样。 - abyx
我已经将sum更改为sums,但仍出现相同的错误。 - Charlie Epps
当然可以。下面的答案解释了实际问题所在。我只是说现在阴影sum函数是一个更好的做法 :) - abyx
此外,我认为您可以从答案中看出,您试图做什么并不清楚。您能否添加一份描述,说明该代码应该完成什么任务? - abyx
3个回答

8
您的lambda函数只有一个参数,但是reduce需要一个带有两个参数的函数。请将您的lambda函数改为带有两个参数的函数。
由于您没有说明您想要这段代码做什么,我就猜测一下:
the_sum=reduce(lambda x,y:abs(y[1]-x[1]),a)

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.

如果问题是其他方面导致的,请详细阐述。

附注:Python列表推导式比任何其他方法都更好、更高效。


2

reduce函数期望传入的函数接受两个参数。对于可迭代对象中的每个元素,它都会将当前元素和前一个函数返回值传递给该函数。因此,获取列表的总和为reduce(lambda x,y: x+y, l, 0)

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

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

但是我可能误解了您想要的内容。更多信息在reduce函数的文档字符串中。


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