在开发中对列表去重是非常常见的需求,列表去重也是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种方式相关推荐

  1. python显示日历_Python获取时间范围内日期列表和周列表的函数

    Python获取时间范围内日期列表和周列表的函数 1.获取日期列表 # -*- coding=utf-8 -*- import datetime def dateRange(beginDate, en ...

  2. python命令行模式怎么输入_python获得命令行输入的参数的两种方式

    外部直接执行python文件时,我们有时需要获得命令行的参数6ok免费资源网 获得命令行参数的两种方式6ok免费资源网 1.通过sys.argv6ok免费资源网 sys.argv:获得一个参数列表,第 ...

  3. python 运算符重载_Python 炫技操作:模块重载的五种方法

    点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货!明哥原创的200页<PyCharm 中文指南> 震撼发布 系列文 ...

  4. python协程实现一万并发_python进阶:服务端实现并发的八种方式

    [本文导读]文中有许多不妥之处,敬请批评指正!python编写的服务端,有八种实现并发的方式,如阻塞(对等)套接字实现并发.非阻塞套接字实现并发.epoll实现并发.多进程实现并发.多线程实现并发.进 ...

  5. python中两个集合的运算并交补_三种方式实现 Python 中的集合的交、并、补运算...

    文章目录 三种方式实现 Python 中的集合的交.并.补运算 一 背景 集合这个概念在我们高中阶段就有所了解,毕业已多年,我们一起回顾一下几个集合相关的基本概念吧? 集合是指具有某种特定性质的具体的 ...

  6. keil5函数 默认返回值_python实用技巧——获取部分返回值的4种方式

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! python的函数支持返回多个值.返回多个值时,默认以tuple的方式返回. 例如,下面两个函数的定义是完全 ...

  7. python反转列表解析_Python语法糖之:列表解析、集合解析和字典解析

    ☆ Python的列表解析 (list comprehensions)是在Python 2.0以来一直都有的功能,特别简洁.实用.而字典解析虽然曾经在Python 2.3版本中引入过,但后来因为与di ...

  8. python 只取数值_Python:你会生成列表吗?-- 列表生成式

    当有人问你:"你会用 Python 生成列表吗?" 我想你一定会说:"当然会啊,这有什么难的." 那人再问:"那你会列表生成式吗?" 你:& ...

  9. python 定义数字_Python:已定义数字列表的差异

    我正在尝试创建一个打印已定义数字列表的方差的函数: grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5] 到目前为止,我 ...

  10. python 多个列表合并_Python对两个有序列表进行合并和排序的例子

    Python对两个有序列表进行合并和排序的例子 这篇文章主要介绍了Python对两个有序列表进行合并和排序的例子,最终代码经过不断优化,小编非常满意,需要的朋友可以参考下 假设有2个有序列表l1.l2 ...

最新文章

  1. shell命令之---Linux文件权限
  2. Android Studio 初体验
  3. 算法导论——计数排序
  4. osx java 6_OSX 10.11 java 6不兼容怎么办?OSX 10.11 java 6不兼容解决办法
  5. php读取usb设备信息,急,请问如何获取USB设备的路径,非HID类型
  6. oracle 数据库的非指令备份方法
  7. 图卷积神经网络(part4)--GNN
  8. JavaScript学习总结(九)——Javascript面向(基于)对象编程
  9. 前端学习(1399):多人管理19项目拦截器
  10. 阿里云轻应用服务器 宝塔面板 mongodb 配置外网连接 其一 基础配置
  11. [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串...
  12. 剑指Offer之逆序对问题
  13. 谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
  14. python_统计数组中指定范围的数据占的比例
  15. 拜托,面试别再问我TopK了!!!
  16. Kepware助力数据中心对接楼宇自动化系统
  17. 构建五种机器学习模型作比较(某金融数据集)
  18. 上市公司环境信息披露合集-上市公司环保补助金额、环保税等三大维度指标(2003-2020年)
  19. 国产电子书的代表作是什么样的?
  20. 跳动爱心代码-李峋爱心代码(手把手教学)

热门文章

  1. SpringBoot项目生成二维码,再生成Excel文件导出,亲测采坑
  2. 正交补集(Orthogonal Complements)
  3. Python实战 | 爬取37000+四字成语 BeautifulSoup+requests+多线程
  4. Linux使用megacli在线添加硬盘到raid
  5. 109.【Java最全腾讯地图接口】
  6. 【电子量产工具】6. 业务系统
  7. 海外华人代购系统、代购源码PHP前端源码参数说明
  8. Ecshop支付宝插件SQL注入及漏洞利用(exp)
  9. java 调用 nfs_java 访问共享目录(samba和NFS配置及实现)
  10. JavaScript异步Promise