2014-01-20 78 views
1

我正在編寫一個函數來生成n個布爾值的列表。假設返回的列表是[True, False, True, True, False]。我需要根據布爾值生成列表,以識別相同值的條紋。所以在這種情況下的結果將是[1, 1, 2, 1]。出於某種原因,我的代碼不包含上次運行。在提供的例子中,我的產品會產生[1, 1, 2]。我似乎無法弄清楚爲什麼會發生這種情況,以及如何解決這個問題。提前致謝!Python函數不會將最後一個值附加到列表中

#Makes list of bools 
def bools(p, n): 
    return (rand(n) < p) 

#Makes list that counts successive values 
def succession(p, n): 
    run = bools(p, n) 
    print run 

    successionlist = [] 

    counter = 1 
    for j in range(1, n): 
     if run[j] == run[j - 1]: 
      counter = counter + 1 
     else: 
      successionlist.append(counter) 
      print successionlist 
      counter = 1 
+0

旁白:你可能會感興趣的[ 'itertools.groupby'](http://docs.python.org/2/library/itertools.html#itertools.groupby);你的代碼會變成類似於'[sum(1 for for g)for k,g in groupby(run)]''。 – DSM

回答

1

只有當你得到不同的值時才追加。你需要在結束時再次追加

successionlist = [] 

counter = 1 
for j in range(1, n): 
    if run[j] == run[j - 1]: 
     counter = counter + 1 
    else: 
     successionlist.append(counter) 
     print successionlist 
     counter = 1 
successionlist.append(counter) 
print successionlist 
0

您需要添加succesionlist.append(counter)的身體經常你的函數,對for循環之後。原因在於只有當值從True變爲False或反之亦然時,纔會將計數器追加到列表中,但該值在最後一個值之後永遠不會更改,即使您當前有需要的元素數爲最終結果。隨後,您總是需要在循環後附加計數器。

-1

這樣做:

counter = 1 
for j in range(1, n): 
    if run[j] == run[j - 1]: 
     counter = counter + 1 
    else: 
     successionlist.append(counter) 
     print successionlist 
     counter = 1 
else: 
    successionlist.append(counter) 
+1

'for'循環後的'else'是多餘的。 – jayelm

+0

@ jmu303這不是必要的,但是正確的。 – Xuan

0

嗯,你只是一個值追加到繼承列表,如果最後兩個元素不同。因此,如果您的輸入數組以結束序列結束,則循環會遍歷並只增加計數器而不將其添加到結果列表中。當你處於最後一個元素時,我會嘗試檢查這種情況,並且明確地與前一個元素相同。

successionlist = [] 

counter = 1 
for j in range(1, n): 
    if run[j] == run[j - 1]: 
     counter = counter + 1 
     # Check for the last element 
     if j == n-1: 
      successionlist.append(counter) 
    else: 
     successionlist.append(counter) 
     print successionlist 
     counter = 1 

print successionlist 
0

嘗試這樣:

list=[True, False, True, True, False] 


def succession(list): 
    result = [] 
    saved = -1 

    for value in list: 
     int_value = int(value) 
     if int_value == saved: 
      result[-1] += 1 
     else: 
      result.append(1) 
     saved = int_value 
    return result 



print succession(list) 
0

最簡單的可能是在追加的開始,而不是繼承的末尾:

#Makes list of bools 
def bools(p, n): 
    return (rand(n) < p) 

#Makes list that counts successive values 
def succession(p, n): 
    run = bools(p, n) 
    print run 

    lastvalue = None 
    successionlist = [] 
    for item in run: 
     if item is not lastvalue: 
      lastvalue = item 
      successionlist.append(0) 
     successionlist[-1] += 1 
相關問題