如何用更Pythonic的方法替换列表中连续重复元素为首次出现值
实现方法
方法1:使用标准库itertools.groupby(最推荐)
这是最符合Pythonic风格的实现,利用标准库内置方法完成需求,可读性和效率都拉满:
import itertools origin = [1, 1, 1, 2, 3, 3, 3, 4, 4, 5, 1, 1, 1] res = [key for key, _ in itertools.groupby(origin)] print(res) # 输出:[1, 2, 3, 4, 5, 1]
itertools.groupby会自动将连续重复的元素归为同一组,迭代返回(组标识, 组内元素迭代器)格式的元组,我们只需要提取每个组的标识即可得到目标结果。
注意:groupby仅识别连续重复元素,非连续的相同元素会被判定为不同分组,刚好匹配你的需求,不会像set一样全局去重导致最后一个1被误删。
方法2:无导入的简化实现(Python3.8+支持)
如果不想导入依赖,也可以用海象运算符简化手写循环的逻辑:
origin = [1, 1, 1, 2, 3, 3, 3, 4, 4, 5, 1, 1, 1] prev = object() res = [prev := val for val in origin if val != prev] print(res) # 输出:[1, 2, 3, 4, 5, 1]
这里初始化prev为一个和所有列表元素都不可能相等的占位对象,遍历过程中仅保留和前一个元素值不同的元素,同时更新prev的值,时间复杂度和手写循环一致,写法更简洁。
内容的提问来源于stack exchange,提问作者tangolin
相关产品推荐
相关产品推荐

