Python去重并保持原有顺序的三种实现方式

巷口听风
巷口听风
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍在Python中消除序列重复值并保持原有顺序的三种方法。首先通过集合直接去重但无法保序;其次利用生成器和集合判断实现保序去重,要求元素可哈希;最后针对字典等不可哈希对象,通过自定义key函数进行去重。

在Python编程中,经常需要处理序列数据,其中消除重复值并保留元素原始出现顺序是一个常见需求。

若仅需去除重复元素而不关心顺序,最直接的方式是将其转换为集合。例如,对列表 a = [1, 3, 5, 1, 8, 1, 5] 调用 set(a),结果为 {8, 1, 3, 5}。需要注意的是,集合是无序的,因此原始顺序无法保留。

$ python
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1 , 3, 5, 1, 8, 1, 5]
>>> set(a)
{8, 1, 3, 5}
>>> 

若需同时去重并保持顺序,且序列中的元素属于可哈希类型(如整数、字符串等),可以使用生成器配合集合来实现。具体做法是遍历序列,利用一个集合记录已出现的元素,仅当元素未出现过时才通过 yield 输出,并将其加入集合。如代码 所示,函数 dupe 遍历输入序列 items,通过 seen 集合过滤重复项,最终返回去重后的列表 [1, 3, 5, 8]。

$ python
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def dupe(items):
... seen = set()
... for item in items:
... if item not in seen:
... yield item
... seen.add(item)
... 
>>> a = [1 , 3, 5, 1, 8, 1, 5]
>>> list(dupe(a))
[1, 3, 5, 8]
>>>

对于不可哈希的元素(如字典列表),上述基于集合直接判断元素的方法失效。此时可以通过定义 key 函数,对元素提取可哈希的特征值进行去重判断。如代码 所示,函数 rem 接受一个可选的 key 参数。若未提供 key,则直接判断元素本身;若提供 key(如 lambda d: (d['x'], d['y']) 或 lambda d: d['x']),则根据 key 提取的值是否在 seen 集合中来决定是否保留该元素。例如,对包含字典的列表 a 调用 list(rem(a, key=lambda d: d['x'])),可根据字典的 'x' 字段去重,结果保留第一个出现的 'x' 值对应的字典。

Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def rem(items, key=None):
... seen = set()
... for item in items:
... va = item if key is None else key(item)
... if va not in seen:
... yield item
... seen.add(va)
... 
>>> a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]>>> list(rem(a, key=lambda d: (d['x'],d['y'])))
[{'y': 2, 'x': 1}, {'y': 3, 'x': 1}, {'y': 4, 'x': 2}]
>>> list(rem(a, key=lambda d: d['x']))
[{'y': 2, 'x': 1}, {'y': 4, 'x': 2}]

>>>>>> #lambda is an anonymous function:
... fuc = lambda : 'haha'
>>> print (f())
>>> print (fuc())
haha
>>> 

以上介绍了Python中消除序列重复值并保持顺序的几种典型实现方式,涵盖了从简单集合转换到生成器过滤,再到针对不可哈希对象的自定义键值去重策略。希望这些示例能为处理类似数据清洗任务提供参考。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表