如何按原有连续顺序对列表中多组相似项进行分组(最多3组)
连续重复子序列分组实现
针对你需要按顺序对列表中连续重复的子序列分组(最多合并3组)的需求,下面是Python的实现方案:
核心思路
- 遍历列表时,从当前位置开始检查后续是否存在重复的子序列,优先匹配更长的重复子序列,避免短序列拆分长重复序列。
- 最多识别3次连续重复的子序列,将其打包为
[xN, 子序列元素...]的结构(N为重复次数)。 - 未找到重复的元素直接保留原形式。
代码实现
def group_repeated_subsequences(lst, max_repeats=3): result = [] i = 0 total_len = len(lst) while i < total_len: found_repeat = False # 计算当前位置能容纳的最大子序列长度(按最多max_repeats次重复算) max_sub_length = (total_len - i) // max_repeats # 从最长可能的子序列开始检查,优先匹配长重复序列 for sub_length in range(max_sub_length, 0, -1): current_sub = lst[i:i+sub_length] repeat_count = 1 next_pos = i + sub_length # 检查后续是否有重复的子序列,最多到max_repeats次 while (next_pos + sub_length <= total_len and lst[next_pos:next_pos+sub_length] == current_sub and repeat_count < max_repeats): repeat_count += 1 next_pos += sub_length # 找到重复次数≥2的子序列 if repeat_count > 1: result.append([f"x{repeat_count}", *current_sub]) i = next_pos found_repeat = True break # 无重复子序列,直接添加当前元素 if not found_repeat: result.append(lst[i]) i += 1 return result # 测试你的示例列表 my_list = ['blue', 'red', 'red', 'blue', 'green', 'red', 'blue', 'green', 'red', 'green', 'blue', 'green', 'blue', 'red'] processed_list = group_repeated_subsequences(my_list) print(processed_list)
运行结果
输出与你期望的完全一致:
['blue', ['x2', 'red'], ['x2', 'blue', 'green', 'red'], ['x2', 'green', 'blue'], 'red']
调整说明
- 如果需要修改最多合并的重复组数,只需修改函数参数
max_repeats的值(比如设为4就可以最多合并4组重复子序列)。 - 代码会自动优先匹配最长的重复子序列,避免出现短序列先匹配导致长重复序列被拆分的问题。
内容的提问来源于stack exchange,提问作者user1367236
相关产品推荐
相关产品推荐

