2016-09-06 55 views
2

我有一個列表如下,只由(-1)S和1S:如何計算連續複製Python列表

list1=[-1,-1,1,1,1,-1,1] 

我想連續重複的次數追加到一個列表,例如:

count_dups=[2,3,1,1] 

我試圖創建一個新的列表,並使用壓縮功能的第一步,但 似乎不能去,因爲截止最終值對

list2=list1[1:] 
empty=[] 
for x,y in zip(list1,list2): 
    if x==y: 
     empty.append(x) 
    else: 
     empty.append(0) 
+0

爲什麼你使用'zip'這裏?它似乎與任務無關。 – TigerhawkT3

+0

我認爲你應該使用'itertools.groupby'來代替。 – ozgur

+0

請參閱[此問題](http://stackoverflow.com/q/6352425)。它有一個傳統的實現和一個使用groupby。您應該能夠調整它們以滿足您的要求。 –

回答

4

您可以使用itertools.groupby

from itertools import groupby 
list1 = [-1, -1, 1, 1, 1, -1, 1] 
count_dups = [sum(1 for _ in group) for _, group in groupby(list1)] 
print(count_dups) 

輸出

[2, 3, 1, 1] 
+1

'len(list(group))'在小序列中往往會更快,但是如果你有一個非常大的可迭代的大連續值,那麼值得考慮'sum(1 for for group)'。 –

+0

我只是編輯這個使用迭代器,而不是轉換爲列表= D是的 - 我同意。 – Karin

+1

FWIW,在'sum'生成器表達式以及列表理解的外部部分中重新使用變量名'_' _might_會被新的編碼器混淆,特別是如果他們不熟悉使用' _'作爲循環中的一次性名稱。所以你可能想提一下'_'的兩個用法是相互獨立的。 –

0
def count_dups(L): 
    ans = [] 
    if not L: 
     return ans 
    running_count = 1 
    for i in range(len(L)-1): 
     if L[i] == L[i+1]: 
      running_count += 1 
     else: 
      ans.append(running_count) 
      running_count = 1 
    ans.append(running_count) 
    return ans 
0
def count_dups(lst): 
    return reduce(
     lambda a,b: (((a[-1] == b) and (a[:-2] + [a[-2]+1,a[-1]])) or (a[:-1] + [1,b])) , 
     lst[1:] , 
     [1,lst[0]] 
    )[:-1]