如何编写Python函数查找列表中的重复子序列?
查找列表中重复数字序列的函数实现
需求概述
需要编写一个函数,接收列表/数组作为输入,找出其中的重复数字序列。
示例
- 输入:
[111, 0, 3, 1, 111, 0, 3, 1, 111, 0, 3, 1],重复块为[111, 0, 3, 1] - 输入:
[11, 34, 132, 54, 90, 430, 657, 689, 34, 90, 90, 90, 46, 34, 657, 689, 34, 90, 90, 90, 46, 34, 657, 689, 34, 90, 90, 90, 46, 34],重复子列表为[657, 689, 34, 90, 90, 90, 46, 34] - 输入:
[569, 374, 879, 374, 879, 460, 568, 488, 460, 568, 488, 460, 568, 488, 750, 750],存在两个重复块:[374, 879]、[460, 568, 488] - 输入:
[45, 98, 45, 98, 45],重复块为[45, 98](需从起始位置识别,排除重叠块[98, 45])
数据集约束
- 整个列表本身不是重复序列
- 重复序列至少完整出现两次
- 重复序列可出现在列表任意位置(开头/中间/结尾)
- 若存在重叠序列,优先选择最大的序列
- 列表中可能存在多个不重叠的重复序列
- 重复块至少包含两个元素
- 优先选择最大块,若小块构成大块则忽略小块,例如
[230, 205, 900, 617, 821, 188, 617, 821, 205, 900]中,[617, 821]因属于更大块而无效
期望输出
函数需返回便捷的数据结构(如列表的列表、键值对等),保留初始顺序,标记每个唯一重复序列的起始和首次结束位置。
我的尝试
我尝试用itertools.groupby实现,但无法满足需求:
import itertools def get_seq_group(seq): return [(key, list(group)) for key, group in itertools.groupby(seq)] list_a = [111, 0, 3, 1, 111, 0, 3, 1, 111, 0, 3, 1] list_b = [67, 4, 67, 4, 67, 4, 67, 4, 2, 9, 0] list_c = [11, 34, 132, 54, 90, 430, 657, 689, 34, 90, 90, 90, 46, 34, 657, 689, 34, 90, 90, 90, 46, 34, 657, 689, 34, 90, 90, 90, 46, 34] list_d = [569, 374, 879, 374, 879, 460, 568, 488, 460, 568, 488, 460, 568, 488, 750, 750] print(get_seq_group(list_a)) print(get_seq_group(list_b)) print(get_seq_group(list_c)) print(get_seq_group(list_d))
该实现仅能对相邻重复元素分组,无法识别非相邻的重复序列。例如list_a的输出为:
[(111, [111]), (0, [0]), (3, [3]), (1, [1]), (111, [111]), (0, [0]), (3, [3]), (1, [1]), (111, [111]), (0, [0]), (3, [3]), (1, [1])]
问题诉求
我未找到适配该场景的算法,尝试将列表转为字符串拼接后无法还原原始列表,参考相关方案也无效。希望获得:
- 适配该需求的算法说明
- 函数式和命令式两种实现方案的对比
内容的提问来源于stack exchange,提问作者Rashiq
相关产品推荐
相关产品推荐

