2009-11-17 91 views
4

以下是我的Python代码: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 2009-11-17 06:59:46

+0

我已将总数更改为总和,并且发生相同的错误。 – 2009-11-17 07:14:55

+0

当然可以。下面的答案解释了真正的问题。我刚才说这是一个更好的做法,现在阴影'总和'功能:) – abyx 2009-11-17 07:23:24

回答

8

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

既然你没有说你想要什么这个代码做,我就猜:

the_sum=reduce(lambda x,y:abs(y[1]-x[1]),a) 
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函数的文档字符串。

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 List comprehension比其他任何东西都好得多。