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
相关产品推荐
相关产品推荐

