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基于动态规划算法计算单词距离
Jul 25 Python
Python自定义主从分布式架构实例分析
Sep 19 Python
简单易懂的python环境安装教程
Jul 13 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
Python csv文件的读写操作实例详解
Nov 19 Python
Django models filter筛选条件详解
Mar 16 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
python 画条形图(柱状图)实例
Apr 24 Python
如何在向量化NumPy数组上进行移动窗口
May 18 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新手谈谈我的学习心得
2007/02/25 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
浅析get与post的一些特殊情况
2014/07/28 PHP
php判断linux下程序问题实例
2015/07/09 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
js中new一个对象的过程
2017/02/20 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
python实现zabbix发送短信脚本
2018/09/17 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
python多进程使用函数封装实例
2020/05/02 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
sort命令的作用和用法
2012/11/04 面试题
灵泰克Java笔试题
2016/01/09 面试题
电台编导求职信
2014/05/06 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server