你应该知道的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的框架下的web app的详细教程
Apr 30 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
Python3.5字符串常用操作实例详解
May 01 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
python实现的分层随机抽样案例
Feb 25 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
python中pow函数用法及功能说明
Dec 04 Python
使用Python实现音频双通道分离
Dec 25 Python
python中用ggplot绘制画图实例讲解
Jan 26 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自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
flask框架中的cookie和session使用
2021/01/31 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
法学专业应届生求职信
2013/10/16 职场文书
开办饭店创业计划书
2013/12/28 职场文书
《自选商场》教学反思
2014/02/14 职场文书
领导失职检讨书
2014/02/24 职场文书
会计实训总结范文
2015/08/03 职场文书
MySQL之DML语言
2021/04/05 MySQL
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
SQL基础的查询语句
2021/11/11 MySQL