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

如何编写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])]

问题诉求

我未找到适配该场景的算法,尝试将列表转为字符串拼接后无法还原原始列表,参考相关方案也无效。希望获得:

  1. 适配该需求的算法说明
  2. 函数式和命令式两种实现方案的对比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:25:02