You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对列表中连续重复元素序列进行分组统计?

问题

给定元素列表:

lst = ['green','green','red','blue','red','blue','yellow','white','black','yellow','white','black','red','green','yellow','black']

需要对其中连续重复的元素序列(无论序列长度)进行分组统计,期望输出格式:

['green x2','red-blue-x2','yellow-white-black x2','red','green','yellow','black']

已实现单个元素重复的统计,但无法处理多元素连续重复的情况;尝试Python的itertools.groupby仅能统计单个元素重复,寻求可行解决方案。

Python 解决方案

核心思路是滑动窗口匹配+统计重复次数:从当前位置的最长可能子序列开始检测,一旦找到连续重复的序列就跳过已匹配部分,继续处理剩余元素。

以下是具体实现代码:

def count_consecutive_sequences(lst):
    result = []
    i = 0
    n = len(lst)
    
    while i < n:
        # 计算当前位置能取的最大子序列长度(剩余元素的一半)
        max_len = (n - i) // 2
        found = False
        # 从最长到最短尝试匹配重复子序列
        for seq_len in range(max_len, 0, -1):
            if lst[i:i+seq_len] == lst[i+seq_len:i+2*seq_len]:
                count = 1
                # 统计连续重复的总次数
                while i + (count+1)*seq_len <= n and lst[i:i+seq_len] == lst[i+count*seq_len:i+(count+1)*seq_len]:
                    count += 1
                # 格式化结果字符串
                seq_str = '-'.join(lst[i:i+seq_len])
                result.append(f"{seq_str} x{count}")
                # 跳过已处理的所有重复片段
                i += count * seq_len
                found = True
                break
        # 无重复子序列时添加单个元素
        if not found:
            result.append(lst[i])
            i += 1
    return result

# 测试示例
lst = ['green','green','red','blue','red','blue','yellow','white','black','yellow','white','black','red','green','yellow','black']
print(count_consecutive_sequences(lst))

代码要点

  • 外层循环用i标记当前处理的起始位置,逐步推进遍历整个列表
  • 从最长可能的子序列开始匹配,避免误判短序列重复(比如先匹配单个元素重复,而忽略更长的重复序列)
  • 找到重复序列后,统计所有连续重复的次数,而非仅两次
  • 处理完重复序列后直接跳过对应长度的元素,提升效率

运行输出结果:

['green x2', 'red-blue x2', 'yellow-white-black x2', 'red', 'green', 'yellow', 'black']

内容的提问来源于stack exchange,提问作者Ataa Aub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 00:36:27