《Python Cookbook 3rd》笔记(1.10):删除序列相同元素并保持顺序
删除序列相同元素并保持顺序
问题
怎样在一个序列上面保持元素顺序的同时消除重复的值?
解法
如果序列上的值都是 hashable 类型,那么可以很简单的利用集合或者生成器来解决这个问题。比如:
def dedupe(items):seen = set()for item in items:if item not in seen:yield itemseen.add(item)
下面是使用上述函数的例子:
>>> a = [1, 5, 2, 1, 9, 1, 5, 10]
>>> list(dedupe(a))
[1, 5, 2, 9, 10]
>>>
这个方法仅仅在序列中元素为 hashable 的时候才管用。如果你想消除元素不可哈希 (比如 dict 类型) 的序列中重复元素的话,你需要将上述代码稍微改变一下,就像这样:
def dedupe(items, key=None):seen = set()for item in items:val = item if key is None else key(item)if val not in seen:yield itemseen.add(val)
这里的 key 参数指定了一个函数,将序列元素转换成 hashable 类型。下面是它的用法示例:
>>> a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]
>>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}]
>>> list(dedupe(a, key=lambda d: d['x']))
[{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]
>>>
如果你想基于单个字段、属性或者某个更大的数据结构来消除重复元素,第二种方案同样可以胜任。
讨论
如果你仅仅就是想消除重复元素,通常可以简单的构造一个集合。比如:
>>> a
[1, 5, 2, 1, 9, 1, 5, 10]
>>> set(a)
{1, 2, 10, 5, 9}
>>>
在本节中我们使用了生成器函数让我们的函数更加通用,不仅仅是局限于列表处理。比如,如果如果你想读取一个文件,消除重复行,你可以很容易像这样做:
with open(somefile,'r') as f:for line in dedupe(f):...
上述 key 函数参数模仿了 sorted() , min() 和 max() 等内置函数的相似功能。
《Python Cookbook 3rd》笔记(1.10):删除序列相同元素并保持顺序相关推荐
- 《Python Cookbook 3rd》笔记汇总
文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...
- 《Python cookbook》笔记一
<Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素
<Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...
- Python Cookbook 3rd Edition Documentation
Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- 北理工嵩天Python语言程序设计笔记(10 Python计算生态概览)
前言 本文是对<北理工 嵩天/黄天宇/礼欣 Python语言程序设计>的学习笔记,供自己查阅使用. 文章目录 北理工嵩天Python语言程序设计笔记(目录) 北理工嵩天Python语言程序 ...
最新文章
- Java微信二次开发(八)
- 《自动化技术中的进给电气传动》1.4节读书笔记
- 宏内核linux,Linux 为什么还要坚持使用宏内核?
- C# WPF文本框TextEdit不以科学计数法显示
- NOIP模拟测试20「周·任·飞」
- php一句话后门学习(含免杀)
- 可交互的 Attention 可视化工具!我的Transformer可解释性有救了?
- HDOJ 4302 Holedox Eating (multiset || 线段树)
- 【NLP笔记】理论与实践详解词向量
- 社会工程学之《反欺骗的艺术》的思考
- 基于Eclipse+Java+Swing+Mysql实现旅游管理信息系统
- 基于机器视觉技术的表面缺陷检测技术综述
- C++学习笔记——C++中四个点代表什么意思?
- python爬取其他人微信朋友圈_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈...
- 基于MATLAB/Simulink的Buck变换器仿真模型,包含开环控制和闭环控制两种控制
- disk drill 中文版|disk drill pro v4.0.533中文便携版
- 面向对象案例——贪吃蛇游戏
- 重回coding时代 spark hadoop winutils 报错
- Java后台相关知识盘点(持续更新中)
- Springboot整合WebSocket实现网页版聊天,快来围观!