2017-10-07 72 views
1

我有一個像下面計算連續出現

myList = [A, A, A, A, A, B, A, A, C, A, B, A, A, B, B, A, B, C, A, C, A, A, C, B, A, C, C, B, A, A, B, A, B, B, A, C, B, B, A, B, B, B, B, B, C, B, C, A, B, C, B, B, C, C, C, A, A, C, A, B, C, A, C, C, B, A, C, B, B, C, B, C, C, C, A, C, C, B, C, C, C] 

我已經切片myList中,以每單3元的81項列表

for i in range(0,len(myList),3): 
    miniList= myList [i:i + 3] 

所以miniList現在將

[A,A,A] consecutive Occurrence 
[A,A,B] 
[A,A,C] 
. 
. 
. 
[C,C,C] consecutive Occurrence 

我於是寫了一個調用的函數

def countOccurrence(miniList): 
    count = 1 
    Num_Sequence = 0 
    for i in range(len(miniList)-1): 
     if miniList[i] == miniList[i+1]: 
      count +=1 
      if(count == 3): 
       Num_Sequence += 1 
       print(miniList) #debugging purposes 
       print(Num_Sequence) #debugging purposes 

    return Num_Sequence 

Num_Sequence假設返回3而不是1.誰能告訴我我的代碼有什麼問題嗎?

+1

你能告訴我們「連續出現」究竟是什麼嗎? –

+0

你的意思是當數組中的所有字符都相同時它應該返回3嗎? – user1190882

+0

對不起,我應該詳細說明。所以如果miniList具有所有相同的字符,例如[A,A,A],那麼它返回true –

回答

3

的問題是,你不比較第0個元素和第2個元素,即只做與當前chec的下一個元素的比較ked--意味着永遠不會有第三場比賽。

相反,我建議你試試這個 - 這完全跳過循環:

def countOccurrence(miniList): 
    count = 1 
    Num_Sequence = 0 

    if miniList.count(miniList[0]) == 3: 
     Num_Sequence = 3 
     return Num_Sequence 

    return Num_Sequence 

這是什麼程序做是檢查是否有3次出現的第一個元素miniList。由於miniList大小爲3,所以出現的唯一方式是3,如果所有元素都是相等的,所以用於比較的無關緊要。

我跑這個如下:

for i in range(0,len(myList),3): 
    miniList= myList [i:i + 3] 
    print countOccurrence(miniList) 

,並在年底得到了3預期。

這是情況的解決方案,你真正想要miniList爲3元子列表清單:

miniList = []; 
for i in range(0,len(myList),3): 
    miniList.append(myList [i:i + 3]) 

這追加每個子表到miniListcountOccurence仍然有效。您可以將相同的append邏輯得到計數的miniList每一個元素:

out = []; 
for elem in miniList: 
    out.append(countOccurrence(elem)) 
+0

如果您在countOccurrence上添加打印語句,它仍然是相同的。打印(「miniList」),它只打印[C,C,C]。不是[A,A,A],[B,B,B],[C,C,C] –

+0

這可能是嗎? – atru

2

zip(*[iter(myList)]*3) - 這將列表分割成大塊3

[ i for i in zip(*[iter(myList)]*3) if len(set(i)) == 1 ] 

輸出:

[('A', 'A', 'A'), ('B', 'B', 'B'), ('C', 'C', 'C')] 

爲了得到長

len([ i for i in zip(*[iter(myList)]*3) if len(set(i)) == 1 ]) 
3 
0

你的變量Num_SequencecountOccurrence(miniList)在函數中的局部變量。所以每次你的函數被調用時,變量都會被重新創建,永遠不會達到3. 像這樣改變你的代碼。

Num_Sequence = 0 # Good habit is to start your variable with lowercase, not uppercase 

def countOccurrence(miniList): 
    global Num_Sequence # Indicating that you are going to change the global variable. 
    # Rest of your code. 
0

在代碼中有很多問題會使代碼變得複雜並給出錯誤的結果。

首先,正如別人所說,你不會比較第三個字符和其他字符。

其次,你使用太多的迭代和計數變量。

第三,miniList= myList [i:i + 3]只是創建一個[C,C,C]列表。

一種更簡單和明確的實施看起來是這樣的:

A = 'A' 
B = 'B' 
C = 'C' 

miniList = [] 

myList = [A, A, A, A, A, B, A, A, C, A, B, A, A, B, B, A, B, C, A, C, A, A, C, B, A, C, C, B, A, A, B, A, B, B, A, C, 
      B, B, A, B, B, B, B, B, C, B, C, A, B, C, B, B, C, C, C, A, A, C, A, B, C, A, C, C, B, A, C, B, B, C, B, C, 
      C, C, A, C, C, B, C, C, C] 

for i in range(0,len(myList),3): 
    miniList.append(myList[i:i + 3]) 

print(miniList) 

def countOccurrence(miniList): 
    Num_Sequence = 0 
    for item in miniList: 
     print(item) 
     if (item[0] == item[1] and item[0] == item[2]): 
      Num_Sequence += 1 
      print(item, '\n') #debugging purposes 
      print(Num_Sequence, '\n') #debugging purposes 

    return Num_Sequence 

result = countOccurrence(miniList) 
print(result) 

我剛分配的A,B,C,變量字符這樣我就可以進行這項工作。我還添加了一些檢查打印。