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

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

本文介绍在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。