2013-09-16 97 views
1

我想從現有的列表中創建一個列表。做數學的列表 - python

原文有列表:

mylist = ["single extra", "double double", "tripple, double, singe", "mohan point tripple decker","one","covent gardens london tw45hj", "honda"] 

找出每個標籤的單詞數在MYLIST:

num_words = [len(sentence.split()) for sentence in mylist] 

打印NUM_WORDS

[2, 2, 3, 4, 1, 4, 1] 

讓我們假裝MYLIST是一個單一的長串一會兒,

"single extra double double tripple double singe mohan point tripple decker one covent gardens london tw45hj honda" 

我想弄清楚每個標籤從哪一個長列表開始。

所以我知道在原始列表中「mylist」第一個索引有2個單詞,所以它會從0開始到2,然後下一個索引包含2個單詞,這樣會從3開始到5,依此類推...

手動數學會像這樣:

1 + 2 = 3 
3 + 2 = 5 
5 + 3 = 8 
8 + 4 = 12 
12 + 1 = 13 
13 + 4 = 17 
17 + 1 = 18 

我嘗試這樣做:

p=0 
x=1 
for i, item in enumerate(num_words): 
    result = num_words[p] + num_words[x] 
    results = result + num_words[x] 
    x += 1 
    p += 1 

打印效果

但那失敗...

我希望這是有道理的.....

感謝所有

回答

3

你想要做的就是所謂的運行總計什麼。您可以使用簡單的循環:

>>> res, c = [], 1 
>>> for x in num_words: 
...  c += x 
...  res.append(c) 
>>> res 
[3, 5, 8, 12, 13, 17, 18] 

它也可以做它實用的風格一行,像這樣:

>>> reduce(lambda x, y: x + [x[-1] + y], num_words, [1])[1:] 
[3, 5, 8, 12, 13, 17, 18] 
+1

對於C perfor此外,還有'np.cumsum'。 – wim

+0

這正是我想要的!非常感謝。 –

+0

@wim謝謝,不知道。 –

1

在py3.x您可以使用itertools.accumulate

>>> from itertools import accumulate 
>>> list(accumulate([1] + lis))[1:] 
[3, 5, 8, 12, 13, 17, 18] 

對於py2.x:

def cummutalive_sum(lis): 
    total = 1 
    for item in lis: 
     total += item 
     yield total 
...   
>>> list(cummutalive_sum(lis)) 
[3, 5, 8, 12, 13, 17, 18] 
+0

+1生成器和積累。有沒有辦法將__future__ itertools導入python 2.7? :) –

+0

@RomanPekar我不這麼認爲。 :) –