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

Python:如何高效去除列表中的相邻重复元素?

嘿,这个需求我太熟了!先给你说清楚为啥set不能用——它是全局去重+无序的,不管元素是不是相邻,只要重复就删,还会打乱顺序,自然会把你需要的最后一个4也搞丢,完全不符合你只处理「相邻重复的3和4」的要求。

下面给你两种比手动写i和i+1判断更优雅的方案,效率都很高:

方法1:用itertools.groupby(简洁高效的标准库方案)

Python的itertools.groupby天生就是用来处理相邻重复元素的神器,它会把列表里相邻的相同元素打包成「键-组」对。我们只需要针对3和4的组做“保留单个”的处理,其他组原样保留就行:

import itertools

def dedupe_34(lst):
    result = []
    for key, group in itertools.groupby(lst):
        # 如果当前组的元素是3或4,只添加一次;否则把整个组的元素都加进去
        if key in (3, 4):
            result.append(key)
        else:
            result.extend(group)
    return result

# 测试示例
test_list = [1, 3, 3, 3, 2, 4, 4, 5, 3, 6, 6, 4]
print(dedupe_34(test_list))  # 输出: [1, 3, 2, 4, 5, 3, 6, 6, 4]

这个方案代码简洁易读,而且groupby是C实现的底层逻辑,效率比纯Python手动遍历还要略高一点。

方法2:手动遍历(无需额外依赖,逻辑直观)

如果你不想导入模块,用一次遍历就能搞定,写法也很紧凑:

def dedupe_34(lst):
    if not lst:  # 处理空列表的边界情况
        return []
    result = [lst[0]]
    for num in lst[1:]:
        last = result[-1]
        # 只有当最后一个元素是3/4,且当前元素和它重复时,才跳过添加
        if not ((last in (3, 4)) and (num == last)):
            result.append(num)
    return result

# 同样的测试示例,输出一致
test_list = [1, 3, 3, 3, 2, 4, 4, 5, 3, 6, 6, 4]
print(dedupe_34(test_list))

这个方法只需要一次遍历,空间复杂度和原列表相当,逻辑也非常清晰,适合不想用外部库的场景。

总结

两种方案都是O(n)的时间复杂度,效率拉满:

  • 追求代码简洁、可读性:选itertools.groupby
  • 不想依赖标准库、自己掌控逻辑:选手动遍历

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:01:42