python列表实现_Python列表去重如何实现?列表去重的4种方式
在开发中对列表去重是非常常见的需求,列表去重也是Python中一种常见的处理方式。列表作为Python中最常用的数据结构,承担了Python中大多数的数据存储任务,但Python本身是不满足互异性的,意思就是有可能重复,那就需要去除这些重复值。那么Python列表去重要怎么做呢?列表去重的方式有很多,下面介绍4种方式,并对其进行性能比较。
让我们先制造一些简单的数据,生成0到99的100万个随机数:
from random import randrange
DUPLICATES= [randrange(100) for _ in range(1000000)]
接下来尝试这4种去重方式中最简单直观的方法:
1. 新建一个数组,遍历原数组,如果值不在新数组里便加入到新数组中。
# 第一种方式
def easy_way():
unique= []
for element in DUPLICATES:
if element not in unique:
unique.append(element)
return unique
进入ipython使用timeit计算其去重耗时:
%timeit easy_way()
# 1.16 s ± 137 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
平均耗时在1.16秒左右,但是在这个例子中我们使用了数组作为存储对象,实际上如果我们改成集合存储去重后的结果,性能会快不少:
def easy_way():
unique=set()
for element in DUPLICATES:
if element not in unique:
unique.add(element)
return unique
%timeit easy_way()
# 48.4 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
平均耗时在48毫秒左右,改善明显,这是因为集合和数组的内在数据结构完全不同,集合使用了哈希表,因此速度会比列表快许多,但缺点在于无序。
接下来看看第2种方式:
2. 直接对数组进行集合转化,然后再转回数组:
# 第二种去重方式
def fast_way()
return list(set(DUPLICATES))
耗时:
%timeit fast_way()
# 14.2 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
平均耗时14毫秒,这种去重方式是最快的,但正如前面所说,集合是无序的,将数组转为集合后再转为列表,就失去了原有列表的顺序。
如果现在有保留原数组顺序的需要,那么这个方式是不可取的,怎么办呢?
3. 保留原有数组顺序的去重
使用dict.fromkeys()函数,可以保留原有数组的顺序并去重:
def save_order():
return list(dict.fromkeys(DUPLICATES))
当然,它会比单纯用集合进行去重的方式耗时稍微久一点:
%timeit save_order()
# 39.5 ms ± 8.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
平均耗时在39.5毫秒,我认为这是可以接受的耗时,毕竟保留了原数组的顺序。
但是,dict.fromkeys()仅在Python3.6及以上才支持。
如果你是Python3.6以下的版本,那么可能要考虑第四种方式了。
4. Python3.6以下的列表保留顺序去重
在Python3.6以下,其实也存在fromkeys函数,只不过它由collections提供:
from collections import OrderedDict
def save_order_below_py36():
return list(OrderedDict.fromkeys(DUPLICATES))
耗时:
%timeit save_order_below_py36()
# 71.8 ms ± 16.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
平均耗时在72毫秒左右,比 Python3.6 的内置dict.fromkeys()慢一些,因为OrderedDict是用纯Python实现的。
以上就是4种Python列表去重的方式,通过耗时比较,其性能高低一目了然。希望上述方式对你学习Python有所帮助。
python列表实现_Python列表去重如何实现?列表去重的4种方式相关推荐
- python显示日历_Python获取时间范围内日期列表和周列表的函数
Python获取时间范围内日期列表和周列表的函数 1.获取日期列表 # -*- coding=utf-8 -*- import datetime def dateRange(beginDate, en ...
- python命令行模式怎么输入_python获得命令行输入的参数的两种方式
外部直接执行python文件时,我们有时需要获得命令行的参数6ok免费资源网 获得命令行参数的两种方式6ok免费资源网 1.通过sys.argv6ok免费资源网 sys.argv:获得一个参数列表,第 ...
- python 运算符重载_Python 炫技操作:模块重载的五种方法
点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货!明哥原创的200页<PyCharm 中文指南> 震撼发布 系列文 ...
- python协程实现一万并发_python进阶:服务端实现并发的八种方式
[本文导读]文中有许多不妥之处,敬请批评指正!python编写的服务端,有八种实现并发的方式,如阻塞(对等)套接字实现并发.非阻塞套接字实现并发.epoll实现并发.多进程实现并发.多线程实现并发.进 ...
- python中两个集合的运算并交补_三种方式实现 Python 中的集合的交、并、补运算...
文章目录 三种方式实现 Python 中的集合的交.并.补运算 一 背景 集合这个概念在我们高中阶段就有所了解,毕业已多年,我们一起回顾一下几个集合相关的基本概念吧? 集合是指具有某种特定性质的具体的 ...
- keil5函数 默认返回值_python实用技巧——获取部分返回值的4种方式
喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! python的函数支持返回多个值.返回多个值时,默认以tuple的方式返回. 例如,下面两个函数的定义是完全 ...
- python反转列表解析_Python语法糖之:列表解析、集合解析和字典解析
☆ Python的列表解析 (list comprehensions)是在Python 2.0以来一直都有的功能,特别简洁.实用.而字典解析虽然曾经在Python 2.3版本中引入过,但后来因为与di ...
- python 只取数值_Python:你会生成列表吗?-- 列表生成式
当有人问你:"你会用 Python 生成列表吗?" 我想你一定会说:"当然会啊,这有什么难的." 那人再问:"那你会列表生成式吗?" 你:& ...
- python 定义数字_Python:已定义数字列表的差异
我正在尝试创建一个打印已定义数字列表的方差的函数: grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5] 到目前为止,我 ...
- python 多个列表合并_Python对两个有序列表进行合并和排序的例子
Python对两个有序列表进行合并和排序的例子 这篇文章主要介绍了Python对两个有序列表进行合并和排序的例子,最终代码经过不断优化,小编非常满意,需要的朋友可以参考下 假设有2个有序列表l1.l2 ...
最新文章
- shell命令之---Linux文件权限
- Android Studio 初体验
- 算法导论——计数排序
- osx java 6_OSX 10.11 java 6不兼容怎么办?OSX 10.11 java 6不兼容解决办法
- php读取usb设备信息,急,请问如何获取USB设备的路径,非HID类型
- oracle 数据库的非指令备份方法
- 图卷积神经网络(part4)--GNN
- JavaScript学习总结(九)——Javascript面向(基于)对象编程
- 前端学习(1399):多人管理19项目拦截器
- 阿里云轻应用服务器 宝塔面板 mongodb 配置外网连接 其一 基础配置
- [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串...
- 剑指Offer之逆序对问题
- 谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
- python_统计数组中指定范围的数据占的比例
- 拜托,面试别再问我TopK了!!!
- Kepware助力数据中心对接楼宇自动化系统
- 构建五种机器学习模型作比较(某金融数据集)
- 上市公司环境信息披露合集-上市公司环保补助金额、环保税等三大维度指标(2003-2020年)
- 国产电子书的代表作是什么样的?
- 跳动爱心代码-李峋爱心代码(手把手教学)
热门文章
- SpringBoot项目生成二维码,再生成Excel文件导出,亲测采坑
- 正交补集(Orthogonal Complements)
- Python实战 | 爬取37000+四字成语 BeautifulSoup+requests+多线程
- Linux使用megacli在线添加硬盘到raid
- 109.【Java最全腾讯地图接口】
- 【电子量产工具】6. 业务系统
- 海外华人代购系统、代购源码PHP前端源码参数说明
- Ecshop支付宝插件SQL注入及漏洞利用(exp)
- java 调用 nfs_java 访问共享目录(samba和NFS配置及实现)
- JavaScript异步Promise