你应该知道的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语言的12个基础知识点小结
Jul 10 Python
python中PIL安装简单教程
Apr 21 Python
pygame实现弹力球及其变速效果
Jul 03 Python
理解python中生成器用法
Dec 20 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
浅析Python装饰器以及装饰器模式
May 28 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
python图片合成的示例
Nov 09 Python
anaconda升级sklearn版本的实现方法
Feb 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
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
Javascript - HTML的request类
2007/01/09 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
javascript的BOM
2016/05/03 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
python删除某个字符
2018/03/19 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
python 检测图片是否有马赛克
2020/12/01 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
shell程序中如何注释
2012/02/17 面试题
竞选劳动委员演讲稿
2014/04/28 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
python中的3种定义类方法
2021/11/27 Python