2013-09-16 2 views
1

기존 목록에서 목록을 만들고 싶습니다.목록의 수학 - 파이썬

원래이 목록 :

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로 시작한다는 점을 알고 있습니다. ...

수동으로 수학과 같이 될 것이다 :

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 

인쇄가

012,351,641 결과 :

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

이 시도

했지만 실패 이잖아 ...

나는이 말이 바랍니다 .....

감사합니다 당신이 총을 실행라고하고 싶었던 무엇 모든

답변

3

. 당신은 간단한 루프를 사용할 수 있습니다 : 그것은 또한 다음과 같이 그것을 기능적인 스타일에서 한 행을 수행 할 수있어

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

: 당신이 사용할 수있는 py3.x에

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

C perfor mance, 이것을위한'np.cumsum '도있다. – wim

+0

이것은 정확히 내가 원했던 것입니다! 고마워. –

+0

@wim 감사합니다, 그것을 몰랐습니다. –

1

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를 파이썬 2.7로 가져올 수있는 방법이 있습니까? :) –

+0

@RomanPekar 나는 그렇게 생각하지 않는다. :) –