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

