你应该知道的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多线程编程(四):使用Lock互斥锁
Apr 05 Python
python实现在每个独立进程中运行一个函数的方法
Apr 23 Python
Python中属性和描述符的正确使用
Aug 23 Python
pycharm安装图文教程
May 02 Python
python交互式图形编程实例(二)
Nov 17 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
python动态进度条的实现代码
Jul 03 Python
python简单的三元一次方程求解实例
Apr 02 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
python pillow库的基础使用教程
Jan 13 Python
Python面向对象之成员相关知识总结
Jun 24 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脚本中include文件出错解决方法
2008/11/20 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
Python中的面向对象编程详解(上)
2015/04/13 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
Python hashlib模块用法实例分析
2018/06/12 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
公司JAVA开发面试题
2015/04/02 面试题
初一学生期末评语
2014/04/24 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers