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

