删除序列相同元素并保持顺序

问题

怎样在一个序列上面保持元素顺序的同时消除重复的值?

解法

如果序列上的值都是 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):删除序列相同元素并保持顺序相关推荐

  1. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  2. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  3. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  4. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  5. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  6. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  7. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  8. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  9. 北理工嵩天Python语言程序设计笔记(10 Python计算生态概览)

    前言 本文是对<北理工 嵩天/黄天宇/礼欣 Python语言程序设计>的学习笔记,供自己查阅使用. 文章目录 北理工嵩天Python语言程序设计笔记(目录) 北理工嵩天Python语言程序 ...

最新文章

  1. Java微信二次开发(八)
  2. 《自动化技术中的进给电气传动》1.4节读书笔记
  3. 宏内核linux,Linux 为什么还要坚持使用宏内核?
  4. C# WPF文本框TextEdit不以科学计数法显示
  5. NOIP模拟测试20「周·任·飞」
  6. php一句话后门学习(含免杀)
  7. 可交互的 Attention 可视化工具!我的Transformer可解释性有救了?
  8. HDOJ 4302 Holedox Eating (multiset || 线段树)
  9. 【NLP笔记】理论与实践详解词向量
  10. 社会工程学之《反欺骗的艺术》的思考
  11. 基于Eclipse+Java+Swing+Mysql实现旅游管理信息系统
  12. 基于机器视觉技术的表面缺陷检测技术综述
  13. C++学习笔记——C++中四个点代表什么意思?
  14. python爬取其他人微信朋友圈_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈...
  15. 基于MATLAB/Simulink的Buck变换器仿真模型,包含开环控制和闭环控制两种控制
  16. disk drill 中文版|disk drill pro v4.0.533中文便携版
  17. 面向对象案例——贪吃蛇游戏
  18. 重回coding时代 spark hadoop winutils 报错
  19. Java后台相关知识盘点(持续更新中)
  20. Springboot整合WebSocket实现网页版聊天,快来围观!

热门文章

  1. 浅聊在美找工作以及工作之后的感受
  2. 一般通话记录能保存多少条_鸡蛋放冰箱,能保存多少天?正确保存方法是什么?...
  3. hbase中列簇和列_为什么不建议在hbase中使用过多的列簇
  4. LSGO软件技术团队2015~2016学年第八周(1019~1025)总结
  5. 【转】dicom网络通讯入门(1)
  6. 【转】C++学习一 结构与结构体
  7. 谈谈你对闭包的理解?
  8. sharepoint文档库文档版本信息操作
  9. 【POJ - 3281】Dining(拆点建图,网络流最大流)
  10. 【POJ - 1364】King(差分约束判无解)