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

Python移除列表中重复的完整子序列(禁用set()函数)

处理数组重复片段的解决方案

嘿,这个需求很明确嘛!既然不能用set()(毕竟它只能针对单个元素去重,还会打乱数组顺序,完全不适合处理这种重复片段的场景),我们可以用简单的切片和匹配逻辑来搞定。

针对你的特定场景(刚好两段重复)

你的数组是两段完全相同的片段拼接而成,总长度是20,重复片段长度是10。那我们可以直接检查前半段和后半段是否一致,一致的话只保留前半段就行:

A = [0,0,1,1,2,5,6,3,7,7,0,0,1,1,2,5,6,3,7,7]
total_length = len(A)
segment_length = total_length // 2

# 验证前后两段是否完全匹配
if A[:segment_length] == A[segment_length:]:
    A = A[:segment_length]

print(A)  # 输出结果: [0,0,1,1,2,5,6,3,7,7]

更通用的情况(支持多次重复片段)

如果你的数组可能存在多次重复的片段(比如三段、四段重复),可以写一个通用函数来自动识别重复单元并只保留一个:

def remove_repeated_segments(arr):
    arr_length = len(arr)
    # 遍历所有可能的重复单元长度(从1到数组长度的一半)
    for unit_length in range(1, arr_length // 2 + 1):
        # 只有数组总长度能被单元长度整除,才可能是重复片段
        if arr_length % unit_length != 0:
            continue
        # 检查所有分段是否和第一个单元完全一致
        is_repeated = True
        for i in range(1, arr_length // unit_length):
            if arr[i*unit_length : (i+1)*unit_length] != arr[:unit_length]:
                is_repeated = False
                break
        if is_repeated:
            return arr[:unit_length]
    # 如果没有找到重复片段,返回原数组
    return arr

# 测试你的例子
A = [0,0,1,1,2,5,6,3,7,7,0,0,1,1,2,5,6,3,7,7]
processed_arr = remove_repeated_segments(A)
print(processed_arr)  # 输出结果: [0,0,1,1,2,5,6,3,7,7]

这个函数的逻辑很直观:先尝试所有可能的重复单元长度,验证每个分段是否和第一个单元一致,一旦找到符合条件的单元,就返回它。如果数组没有重复片段,就原封不动返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:31:49