计算切片列表中的连续出现次数

时间:2017-10-07 07:10:00

标签: python

我有81个项目的列表,如下所示

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个元素

 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.任何人都可以告诉我我的代码有什么问题吗?

4 个答案:

答案 0 :(得分:3)

问题是你没有比较第0和第2个元素,即你只与当前检查的下一个元素进行比较 - 意味着永远不会有第三个匹配。

相反,我建议你试试这个 - 它完全跳过循环:

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

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

    return Num_Sequence

该程序的作用是检查miniList中是否有第3个元素出现。由于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))

答案 1 :(得分: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

答案 2 :(得分: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.

答案 3 :(得分: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变量分配给字符,以便我可以处理它。我还添加了一些检查打印件。