你应该知道的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中的hashlib和base64加密模块使用实例
Sep 02 Python
使用Python制作获取网站目录的图形化程序
May 04 Python
怎样使用Python脚本日志功能
Aug 14 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
Python星号*与**用法分析
Feb 02 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
Jun 21 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
Python实现汇率转换操作
May 03 Python
python中_del_还原数据的方法
Dec 09 Python
python 破解加密zip文件的密码
Apr 22 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
桌面中心(三)修改数据库
2006/10/09 PHP
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
php学习 字符串课件
2008/06/15 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
在Docker上开始部署Python应用的教程
2015/04/17 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
信息技术教学反思
2014/02/12 职场文书
师范生求职自荐信
2014/06/14 职场文书
新店开张活动方案
2014/08/24 职场文书
校园广播稿100字
2014/10/06 职场文书
老人与海读书笔记
2015/06/26 职场文书