2012-10-21 79 views
6

我試圖將一堆列表中的元素配對在一起以創建最終對象,類似於創建一個對象的總和。我試圖在reduce上使用一個簡單的變體,在這個變體中你考慮一個成對的列表而不是一個扁平列表來做到這一點。我想沿着線做一些事情:使用Python減少對的列表

nums = [1, 2, 3] 
reduce(lambda x, y: x + y, nums) 

除了我想更多的信息添加到特定於數字nums列表中的每個元素的總和。例如,對於每一對(A,B)在列表中,運行的總和(A + B):

nums = [(1, 0), (2, 5), (3, 10)] 
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 

這不起作用:

>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: 'int' object is unsubscriptable 

爲什麼它不工作?我知道我可以編碼nums作爲一個平面列表 - 這不是重點 - 我只是希望能夠創建一個reduce操作,可以遍歷一個對列表,或同時在同一長度的兩個列表上進行迭代,並從這兩個列表。謝謝。

+0

你想要的減少是一個元組的結果呢? –

+0

你是否必須使用reduce?我更喜歡簡單的 sum(x [0] + x [1] for x in nums) – cerealy

回答

6

看着你傳遞給reduce拉姆達:

f = lambda x, y: (x[0]+x[1]) + (y[0]+y[1]) 

通過f返回的值將作爲參數的f另一調用傳遞。但是當f期望其參數是成對時,它返回的值是int。你需要使這個函數返回一對。例如,這將分別總結左,右兩側:

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), nums) 
(6, 15) 

你能做的就是從列表中的元素區別對待的累計值的另一件事:你可以使累計值的int,而列表中的元素是成對的。如果你這樣做,你必須通過initializer參數reduce,使得蓄能器被正確初始化爲int

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0) 
21 
+0

有沒有一種方法可以通過對減少迭代器?類似於枚舉(mylist)的列表,它不僅返回當前元素,而且還返回列表中的位置。 'reduce'中的'lambda'可以訪問上面例子中使用的那對數字嗎? – user248237dfsf

+0

@ user248237您可以使用'enumerate(mylist)'作爲'reduce'的輸入。 – interjay