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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:51