如何使用Python3将列表去连续重复后分解为递增序列?
解决Python拆分列表为递增子序列并移除连续重复项的问题
我来帮你搞定这个需求!我们需要把给定的列表拆分成多个严格递增的子序列,同时还要移除其中的连续重复元素。先看一下预期结果对应的逻辑:原列表里的连续重复项(比如末尾的3,3和8,8)会被合并成单个元素,然后再把剩下的元素拆分成尽可能长的递增序列。
方法一:分两步处理(清晰易懂)
先写一个函数移除连续重复元素,再写另一个函数拆分递增子序列:
def remove_consecutive_duplicates(lst): if not lst: return [] cleaned = [lst[0]] for num in lst[1:]: # 只保留和前一个元素不同的项 if num != cleaned[-1]: cleaned.append(num) return cleaned def split_into_increasing_subsequences(lst): if not lst: return [] subsequences = [] current_subseq = [lst[0]] for num in lst[1:]: # 如果当前元素比子序列最后一个元素大,就加入当前子序列 if num > current_subseq[-1]: current_subseq.append(num) else: # 否则,把当前子序列存入结果,新建一个子序列 subsequences.append(current_subseq) current_subseq = [num] # 别忘了添加最后一个未完成的子序列 subsequences.append(current_subseq) return subsequences # 测试代码 original_list = [3, 8, 2, 5, 7, 1, 0, 7, 4, 8, 3, 3, 7, 8, 8] cleaned_list = remove_consecutive_duplicates(original_list) final_result = split_into_increasing_subsequences(cleaned_list) print(final_result) # 输出:[[3, 8], [2, 5, 7], [1], [0, 7], [4, 8], [3, 7, 8]]
方法二:一步到位(更高效)
我们可以把两个步骤合并成一次遍历,减少列表的遍历次数,提升效率:
def process_list(lst): if not lst: return [] result = [] # 初始化第一个子序列,从原列表第一个元素开始 current_subseq = [lst[0]] for num in lst[1:]: # 跳过连续重复的元素 if num == current_subseq[-1]: continue # 检查是否满足递增条件 if num > current_subseq[-1]: current_subseq.append(num) else: # 不满足的话,保存当前子序列并新建 result.append(current_subseq) current_subseq = [num] # 添加最后一个子序列 result.append(current_subseq) return result # 测试代码 original_list = [3, 8, 2, 5, 7, 1, 0, 7, 4, 8, 3, 3, 7, 8, 8] print(process_list(original_list)) # 同样得到预期结果:[[3, 8], [2, 5, 7], [1], [0, 7], [4, 8], [3, 7, 8]]
代码逻辑解释
- 移除连续重复项:遍历列表时,只将与当前子序列最后一个元素不同的元素加入,这样就自动过滤掉了连续重复的数值。
- 拆分递增子序列:遍历过程中维护一个当前的递增子序列,当遇到比子序列最后一个元素小的数值时,就把当前子序列存入结果列表,然后重新开始一个新的子序列。最后一定要记得把最后一个子序列也添加到结果里,避免遗漏。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

