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

