你应该知道的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中的__new__()方法的使用
Apr 09 Python
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
Python中的super()方法使用简介
Aug 14 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
利用anaconda作为python的依赖库管理方法
Aug 13 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
PyQt5实现简单的计算器
May 30 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 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正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
详解vue2.0模拟后台json数据
2019/05/16 Javascript
JS实现简易计算器
2020/02/14 Javascript
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
Python编程argparse入门浅析
2018/02/07 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
将python安装信息加入注册表的示例
2019/11/20 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
实习心得体会
2014/01/02 职场文书
如何写自我鉴定
2014/03/19 职场文书
个人工作总结范文2014
2014/11/07 职场文书
出国签证在职证明范本
2014/11/24 职场文书
导游词之江西赣州
2019/10/15 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS