Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法


Posted in Python onMarch 13, 2018

本文实例讲述了Python从序列中移除重复项且保持元素间顺序不变的方法。分享给大家供大家参考,具体如下:

问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变

解决方案:

1、如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决。

# example.py
#
# Remove duplicate entries from a sequence while keeping order
def dedupe(items):
  seen = set()
  for item in items:
    if item not in seen:
      yield item
      seen.add(item)
if __name__ == '__main__':
  a = [1, 5, 2, 1, 9, 1, 5, 10]
  print(a)
  print(list(dedupe(a)))

运行结果:

[1, 5, 2, 1, 9, 1, 5, 10]
[1, 5, 2, 9, 10]

2、如果序列时不可哈希的,想要去除重复项,需要对上述代码稍作修改:

# example2.py
#
# Remove duplicate entries from a sequence while keeping order
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 item
      seen.add(val)
if __name__ == '__main__':
  a = [ 
    {'x': 2, 'y': 3},
    {'x': 1, 'y': 4},
    {'x': 2, 'y': 3},
    {'x': 2, 'y': 3},
    {'x': 10, 'y': 15}
    ]
  print(a)
  print(list(dedupe(a, key=lambda a: (a['x'],a['y']))))

运行结果:

[{'x': 2, 'y': 3}, {'x': 1, 'y': 4}, {'x': 2, 'y': 3}, {'x': 2, 'y': 3}, {'x': 10, 'y': 15}]
[{'x': 2, 'y': 3}, {'x': 1, 'y': 4}, {'x': 10, 'y': 15}]

key参数的作用是指定一个函数用来将序列中的元素转化为可哈希的类型,如此可以检测重复项。

(代码摘自《Python Cookbook》)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python操作MySQL数据库具体方法
Oct 28 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
对python指数、幂数拟合curve_fit详解
Dec 29 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
利用python在excel中画图的实现方法
Mar 17 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
python 3.8.3 安装配置图文教程
May 21 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
通过cmd进入python的步骤
Jun 16 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 Python
Python+Django搭建自己的blog网站
Mar 13 #Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 #Python
tensorflow实现softma识别MNIST
Mar 12 #Python
wxpython实现图书管理系统
Mar 12 #Python
人生苦短我用python python如何快速入门?
Mar 12 #Python
tensorflow实现KNN识别MNIST
Mar 12 #Python
Python操作MySQL模拟银行转账
Mar 12 #Python
You might like
PHP的AES加密算法完整实例
2016/07/20 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
Python3 元组tuple入门基础
2020/02/09 Python
苹果音乐订阅:Apple Music
2018/08/02 全球购物
工地门卫岗位职责
2013/12/30 职场文书
求职信内容怎么写
2014/05/26 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
企业法律事务工作总结
2015/08/11 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
美元符号 $
2022/02/17 杂记