【python】如何检测List中连续出现相同次数元素的次数

存在一个这样的list = [1,2,1,1,2,1,1,1,2]
我们可以发现单个1出现了一次
两个连续的1出现了一次
三个连续的1出现了一次
那么如何用python来实现这样一个统计呢
本人试过过多次迭代,可是效率极低
想有一个高效判断的方法


from collections import deque


def function_count(arr: list, target):
    count_map = {}
    queue = deque(arr)
    cs = 0
    symbol = arr[-1] == target
    while queue:
        data = queue.popleft()
        if data == target:
            cs += 1
        else:
            count_map[cs] = count_map.get(cs, 0) + 1
            cs = 0
    if symbol:
        count_map[cs] = count_map.get(cs, 0) + 1
    return count_map


if __name__ == '__main__':
    a = [1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2]
    aim = 1
    the_map = function_count(a, aim)
    print("原数组:", a)
    print("匹配目标:", aim)
    for k, v in the_map.items():
        print(f"连续的{k}个{aim}出现了{v}次")

img


改了一下你的测试数据,可以适应更多的情况,用队列,时间复杂度O(1)

可以使用数据结构队列,使用pop将列表最后的元素移除并返回,元素出现一次,第二次移除如果不是一样的元素则在出现一次里面+1,如果连续2次pop或者连续两次以上pop返回的元素均是相同的,那么我们就在相应的地方+1,当所有数字被移除完毕,我们就能得到List中连续出现相同次数元素的次数。

如果列表只有1,2两种元素的话,用以下办法:

>>> lst = [1,2,1,1,2,1,1,1,2]
>>> s = str(lst)[1:-1].replace(',','').replace(' ','').split('2')
>>> s
['1', '11', '111', '']
>>> s.count('1')
1
>>> s.count('1'*2)  #即'11'
1
>>> s.count('1'*3)  #即'111'
1