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

如何在Python中仅移除列表中的连续重复元素?

如何在Python中仅移除列表中的连续重复元素?

嘿,这个需求我之前也碰到过,刚好给你唠唠~

首先得给你点个赞,你自己写的那个循环方法其实非常靠谱!咱们先看一下你写的代码:

data = [1, 1, 2, 2, 2, 3, 1, 1]
result = []
for i in data:
    if not result or result[-1] != i:
        result.append(i)
print(result)  # 输出: [1, 2, 3, 1]

这个方法的思路特别直观:用一个结果列表,遍历原列表的每个元素,只要结果列表是空的,或者最后一个元素和当前元素不一样,就把当前元素加进去。完全符合你“只移除连续重复”的要求,而且性能拉满——它的时间复杂度是O(n)(只遍历一次原列表),空间复杂度也是最优的(最坏情况原列表没有连续重复,结果列表和原列表一样大,这也没办法,毕竟要存结果嘛),处理超大列表完全没压力。

那有没有更简洁的写法?当然有,Python标准库的itertools.groupby就是干这个的好工具!它会自动把连续的相同元素分成一个个组,我们只需要取每个组的“键”(也就是重复的那个元素)就行:

from itertools import groupby

data = [1, 1, 2, 2, 2, 3, 1, 1]
result = [key for key, group in groupby(data)]
print(result)  # 输出同样是 [1, 2, 3, 1]

不过要注意哦,groupby是只看连续元素的,这正好匹配你的需求,和set()或者dict.fromkeys()那种全量去重完全不是一回事,这点你已经区分得很清楚啦~

那回到你的问题:“这是不是最简洁的方法?对大列表友好吗?”

  • 关于简洁性:见仁见智。手动循环的好处是不需要导入任何库,代码逻辑一目了然,新手也能一眼看懂,调试起来也方便;groupby的写法更紧凑,一行列表推导式就搞定,但前提是你得知道这个工具函数的存在。
  • 关于大列表的扩展性:你的手动循环方法已经是线性时间复杂度了,这是处理这类问题的最优复杂度,不管列表多大,效率都很高。groupby的底层实现其实也是类似的遍历逻辑,性能和你的方法差不多,所以两种方法都能轻松hold住大列表。

总结一下:你自己写的方法完全没问题,既高效又易读;如果想追求代码简洁,itertools.groupby是个很棒的替代方案~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:49:31