你应该知道的python列表去重方法


Posted in Python onJanuary 17, 2017

前言

列表去重是写Python脚本时常遇问题,因为不管源数据来自哪里,当我们转换成列表的方式时,有可能预期的结果不是我们最终的结果,最常见的就是列表中元素有重复,这时候第一件事我们就要做去重处理。

我们先来个最简单的方式,用python内置的数据类型set来实现。

假设我们的列表数据是这样的:

level_names = [
 u'Second Level',
 u'Second Level',
 u'Second Level',
 u'First Level',
 u'First Level'
]

因为集合的元素是不能重复的,所以将列表转换成集合时,会自动去掉重复的元素,这就是基本原理,代码如下:

>>> the_list = set(level_names)
>>> print(the_list)
set([u'Second Level', u'First Level'])

这种方式缺点是再转换成列表时无法保存之前的列表顺序,如果没这个要求,这种方式是最简答的, 也许有的小伙伴觉得好简单呀,这没什么技术含量吗,没错,所以一般面试题里让你列表去重一般会这么写:

请写出列表去重的方法(不能用set)

人家写明不能用set了,所以呢,这招有时候还不能用,那当然也难不倒我们,我们还有其他方法。

我们都知道列表可以遍历,能遍历问题也就简单了,我们再定义空列表,然后遍历有数据的列表,再遍历时加一个判断,如果在空列表里没有,就加进去,如果有了就丢掉,代码如下:

the_list = []
for level in level_names:
 if level not in the_list:
  the_list.append(level)
print(the_list)

大家觉得这种方式是不是还可以,但这种方式对付一般的小列表是没问题的,但如果遇到一个超级大列表,也会力不从心,因为在the_list列表变的非常大,在判断时候会影响效率,因为列表是按索引顺序去查找的,当数据量很大时会变慢。

也许你要问了,那我遇到大的列表咋办? 有更牛掰点的方法吗?当然有,让我们继续,既然在判断时用列表会影响效率,那我们就转换一个思路,我们用集合,那你可能要问了,那集合就快了?没错,因为set使用的hash函数查找值,虽然set无序,但位置是固定的,只需一次就可以查到特定元素是否存在,网上有人做了列表和set的元素查找对比,相同的数据条件下,用list耗时16分钟,用set耗时是52秒,这一对比看出效果了吧,别的不多说了,贴代码:

the_list = []
the_set = set()
for level in level_names:
 if level not in the_set:
  the_set.add(level)
  the_list.append(level)
print(the_list)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
python 获取网页编码方式实现代码
Mar 11 Python
代码分析Python地图坐标转换
Feb 08 Python
Django学习笔记之ORM基础教程
Mar 27 Python
python使用matplotlib画饼状图
Sep 25 Python
如何使用python操作vmware
Jul 27 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
Python安装whl文件过程图解
Feb 18 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
python 利用Pyinstaller打包Web项目
Oct 23 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 #Python
Python Socket传输文件示例
Jan 16 #Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 #Python
python一键升级所有pip package的方法
Jan 16 #Python
centos6.7安装python2.7.11的具体方法
Jan 16 #Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 #Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 #Python
You might like
PHP sprintf()函数用例解析
2011/05/18 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
PHP 微信支付类 demo
2015/11/30 PHP
PHP云打印类完整示例
2016/10/15 PHP
php实现微信支付之企业付款
2018/05/30 PHP
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
解析vue中的$mount
2017/12/21 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
教你安装python Django(图文)
2013/11/04 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
常务副总经理岗位职责
2014/04/12 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
交通事故起诉书
2015/05/19 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python