如何对列表中连续重复元素序列进行分组统计?
问题
给定元素列表:
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
相关产品推荐
相关产品推荐

