2009-11-17 90 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比其他任何東西都好得多。