你应该知道的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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
用Python生成器实现微线程编程的教程
Apr 13 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
Python绘制七段数码管实例代码
Dec 20 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
python用插值法绘制平滑曲线
Feb 19 Python
Django在pycharm下修改默认启动端口的方法
Jul 26 Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 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
Protoss热键控制
2020/03/14 星际争霸
多重?l件?合查?(一)
2006/10/09 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
python实现泊松图像融合
2018/07/26 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
python快排算法详解
2019/03/04 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
python实现感知机模型的示例
2020/09/30 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
供电工程专业求职信
2014/08/09 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
党员民主评议自我评价
2014/10/20 职场文书
店铺转让协议书
2015/01/29 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python