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

Python:识别并删除列表中的重复连续序列

我来帮你解决这个识别并删除列表中重复连续序列的问题——首先得明确核心需求:找出所有长度≥2的连续子序列,只要它们在列表中重复出现(不管中间隔了多少元素),就只保留第一次出现的那一份,删除后续的重复项。

先看你给的例子,原列表里的[35195, 28965, 5867, 25847]出现了两次,我们要删掉第二次出现的整个序列,最终得到的列表应该是去掉那四个重复元素后的版本。

接下来给你一个实用的Python实现思路,逻辑清晰,能覆盖大多数常见场景:

代码实现

def remove_duplicate_sequences(lst):
    n = len(lst)
    if n < 2:
        return lst.copy()
    
    # 布尔数组标记每个元素是否保留,初始全为True
    keep = [True] * n
    
    # 从最长的可能序列长度开始检查(最长不会超过列表长度的一半)
    max_possible_len = min(n // 2, n - 1)
    for seq_len in range(max_possible_len, 1, -1):
        # 存储已经见过的(未被标记删除的)序列及其起始索引
        seen_sequences = {}
        
        for start_idx in range(n - seq_len + 1):
            # 如果当前起始位置已经被标记为删除,直接跳过
            if not keep[start_idx]:
                continue
            # 检查当前窗口内的元素是否都未被标记删除(避免处理部分被删除的序列)
            if not all(keep[start_idx : start_idx + seq_len]):
                continue
            
            # 将子序列转为元组(列表不可哈希,元组可以作为字典键)
            current_seq = tuple(lst[start_idx : start_idx + seq_len])
            
            if current_seq in seen_sequences:
                # 发现重复序列,标记当前窗口内的所有元素为删除
                for idx in range(start_idx, start_idx + seq_len):
                    keep[idx] = False
            else:
                # 记录这个序列的起始索引
                seen_sequences[current_seq] = start_idx
    
    # 过滤出需要保留的元素
    return [lst[i] for i in range(n) if keep[i]]

测试你的例子

把你的示例列表整理成合法的Python列表(注意整数不能以0开头):

a = [45874, 35195, 28965, 5867, 25847, 94937, 64894, 55535, 62899, 391, 35195, 28965, 5867, 25847, 8483, 55801, 33129, 42616]
print(remove_duplicate_sequences(a))

输出结果会是:

[45874, 35195, 28965, 5867, 25847, 94937, 64894, 55535, 62899, 391, 8483, 55801, 33129, 42616]

正好符合你的预期——删掉了第二次出现的重复序列。

思路解释

  1. 从长到短遍历序列长度:先检查最长的可能重复序列,确保不会因为短序列的重复标记而破坏长序列的识别。
  2. 标记保留状态:用布尔数组keep记录每个元素是否需要保留,避免重复处理已经被标记删除的元素。
  3. 哈希快速查重:将子序列转为元组存储在字典中,O(1)时间判断是否已经出现过未被删除的相同序列,效率较高。

进阶优化(针对超大列表)

如果你的列表非常大(比如百万级元素),上面的O(n²)方法可能不够高效。这时可以考虑用Rolling Hash(Rabin-Karp算法) 来优化子序列的哈希计算,把时间复杂度降到O(n log n)。核心思路是通过前缀哈希快速计算任意子序列的哈希值,再用字典记录哈希对应的起始索引,发现重复哈希时再验证实际序列是否一致(避免哈希碰撞)。不过这个实现相对复杂,对于大多数日常场景,上面的方法已经足够好用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:31