2013-07-19 104 views
-1

我已經嘗試了一下列表,我想添加列表的其他部分。Python:我可以在列表中添加其他整數嗎?

說我有一個列表

[2,4,8,9,4,2] 

,我想添加兩個和兩個在一起,就像

[2+4,8+9,4+2] so I get the list [6,17,6] 

有一個可能的方式做到這一點,即使該列表的長度變化? (爲便於起見,我認爲這個列表總是以二的倍數位,因此這將是可能做到)

我不知道我可以搜索來回答這個問題

+1

你應該先試一下。這很簡單 – JBernardo

回答

6

打破你的問題向下 - 您想要做兩件事:

  1. 將您的列表拆分爲對(組)。
  2. 總結這些組。

第一容易與the grouper recipe from itertools來達到的:

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 

第二與sum()list comprehension.

[sum(group) for group in grouper([2, 4, 8 ,9, 4, 2], 2)] 

主要優點該方法是,不費力,擴展到任何組的大小。如果你想對每一組100個元素進行求和,那只是改變組的大小。

+2

這確實是我更喜歡的答案。我喜歡它,因爲假設迭代所採用的iterable不會泄漏副作用,那麼grouper函數就是「純」的。我也認爲它在概念上更易於理解 - 至少一次定義了這樣的分組函數。 – user2246674

6
>>> l = [2,4,8,9,4,2] 
>>> v = iter(l) 
>>> [i + next(v) for i in v] 
[6, 17, 6] 
+2

+1我必須贊成這個,因爲我已經在其他地方使用了這個,但直到現在纔將它忘了:) –

+0

雖然它起作用,但手動推進迭代器的想法(當它也是隱式高級的時候)並不是我的首選。 – user2246674

+2

@ user2246674,爲什麼不。它是定義的行爲,並提供了一個美麗的解決方案 –

2
>>> L = [2, 4, 8, 9, 4, 2] 
>>> from operator import add 
>>> list(map(add, *[iter(L)]*2)) 
[6, 17, 6] 
2

不是很有創意,但通用的解決方案可以去像這樣:

def get_chunk_sums(a, chunk_size): 
    return [sum(a[i: i+chunk_size]) for i in xrange(0, len(a), chunk_size)] 

結果:

>>> get_chunk_sums([2,4,8,9,4,2], 2) 
[6, 17, 6] 
>>> get_chunk_sums([2,4,8,9,4,2], 3) 
[14, 15] 
+0

這很整潔! +1 – inspectorG4dget

+0

這是迭代塊的最不受歡迎的方式 - 它僅適用於序列,而不是任意迭代。迭代索引通常是一個糟糕的主意,而且非常難看。 –

相關問題