2013-06-12 57 views
3

我試圖總結列表中的連續數字,同時保持第一個相同。在列表中加上連續的數字。 Python

所以在這種情況下,5會留5,10將是10 + 5(15),和15將是15 + 10 + 5(30)

x = [5,10,15] 
y = [] 

for value in x: 
    y.append(...) 

print y 

[5,15,30] 

回答

4
y = [sum(x[:i+1]) for i in range(len(x))] 
+2

x範圍會更好,如果你使用Python 2.x的 – oleg

+2

這需要一噸的子表的創建,並只適用於序列,而不是任意的迭代。它也在3.2+中重新發明輪子。 –

+1

@ draconisthe0ry:小心這種方法的性能特點,因爲當列表很長時,它變得非常慢。它不僅創建了「len(x)」子列表,而且每次都添加每個子列表,而不是將最新值添加到運行總和中。 Lattyware的答案是pythonic解決方案。 –

9

你想itertools.accumulate()(在Python 3.2添加)。沒有額外的需要,已經爲你實施。

在早期版本的Python這個地方不存在,你可以使用給出的純Python實現:

def accumulate(iterable, func=operator.add): 
    'Return running totals' 
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15 
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120 
    it = iter(iterable) 
    total = next(it) 
    yield total 
    for element in it: 
     total = func(total, element) 
     yield total 

這將可迭代的完美,懶洋洋地和有效。 itertools實現在較低級別上實現,因此速度更快。

如果你想要它作爲一個列表,然後自然只使用list()內置:list(accumulate(x))

0

總而言之,所有元素直到您所在的元素?

x = [5,10,15] 
y = [sum(x[:i+1]) for i in range(len(x))] 
+0

沒有。這使得[[1],[1,2],[1,2,3],[1,2,3,4]]。感謝tho –

+0

@ draconisthe0ry這就是你在你的例子中做的,雖然... – will

+0

@ draconisthe0ry剛剛意識到我錯過了'sum()'函數...... – will

2

隨着numpy.cumsum:

In[1]: import numpy as np 
In[2]: x = [5,10,15] 
In[3]: x = np.array(x) 
In[4]: y = x.cumsum() 
In[5]: y 
Out[6]: array([ 5, 15, 30]) 

我使用Python 3.4

相關問題