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

Python列表相邻重复元素去除问题及代码错误排查

连续元素去重的问题分析与解决方法

你的代码问题在哪?

  • 列表推导式里的x是元素值不是索引!比如输入列表里的x依次是1、1、2...,你用iterable[x]相当于取列表第x个位置的元素,完全偏离了“比较相邻元素”的逻辑。比如第一个x是1,iterable[1]是第二个1,iterable[2]是2,判断1≠2,所以这个1被保留;第二个x还是1,同样的判断逻辑成立,第二个1也被保留,以此类推,最后得到错误的[1,1,3,3]。
  • 退一步说,就算x是索引,x+1还会在处理最后一个元素时触发索引越界错误,因为最后一个元素的x+1超出了列表长度。

为什么用next()会报错?

列表是可迭代对象但不是迭代器,next()只能调用在迭代器上。要把列表转成迭代器,得先调用iter(iterable),之后才能正常使用next()。

最佳实现方法

方法一:遍历对比前一个元素(直观通用)

这种方法适配所有可迭代类型(列表、字符串等),逻辑清晰:

def unique_in_order(iterable):
    result = []
    prev = None
    for item in iterable:
        if item != prev:
            result.append(item)
            prev = item
    return result

print(unique_in_order([1,1,2,2,3,3]))  # 输出 [1, 2, 3]

核心逻辑:记录前一个元素,遍历每个元素时,只要和前一个元素不同就加入结果列表,同时更新前一个元素。

方法二:用itertools.groupby(简洁写法)

groupby会自动把连续重复的元素分组,直接取每组的键值即可:

from itertools import groupby

def unique_in_order(iterable):
    return [key for key, _ in groupby(iterable)]

print(unique_in_order([1,1,2,2,3,3]))  # 输出 [1, 2, 3]

注意:groupby是按连续重复分组,正好匹配你的需求,代码非常简洁。

方法三:迭代器+next()实现(解决你的尝试问题)

如果想用next(),需要先把可迭代对象转为迭代器,同时处理空输入的异常:

def unique_in_order(iterable):
    it = iter(iterable)
    try:
        result = [next(it)]
        for item in it:
            if item != result[-1]:
                result.append(item)
        return result
    except StopIteration:
        return []

print(unique_in_order([1,1,2,2,3,3]))  # 输出 [1, 2, 3]

先取出第一个元素初始化结果列表,之后遍历剩余元素,和结果最后一个元素对比,不同则添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:45:46