你应该知道的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 第一步 hello world
Sep 25 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
详解Python中的__new__()方法的使用
Apr 09 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
python实现在函数中修改变量值的方法
Jul 16 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
学习python需要有编程基础吗
Jun 02 Python
Python 下载Bing壁纸的示例
Sep 29 Python
python自动化测试之Selenium详解
Mar 13 Python
分享Python获取本机IP地址的几种方法
Mar 17 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源代码
2006/10/09 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
Python标准库之循环器(itertools)介绍
2014/11/25 Python
python制作小说爬虫实录
2017/08/14 Python
如何用Python破解wifi密码过程详解
2019/07/12 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
Python实现弹球小游戏
2020/08/01 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
茶叶生产计划书
2014/01/10 职场文书
完美的中文自荐信
2014/05/24 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
晚会开场白和结束语
2015/05/29 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python