2017-10-07 91 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,变量字符这样我就可以进行这项工作。我还添加了一些检查打印。