python3列表去重,python数据去重的函数
列表去重是Python中常用的处理方法,任何编程场景都可能遇到需要列表去重的情况。
重复数据删除的方法有很多种,本文将逐一解释并比较它们的性能。
我们先做一些简单的数据,生成100万个从0到99的随机数:
from randomimportrandrangeduplicates=[rand range(100)for _ in range(1000000)]
接下来,尝试这4种重复数据消除方法中最简单直观的方法:
1.新建一个数组,遍历原数组,如果值不在新数组里便加入到新数组中。
#第一种方法是defe easy _ way():unique=[]for element in duplicates:if element not in unique:unique。append(元素)返回唯一
输入ipython并使用timeit计算其重复数据消除时间:
%timeit easy_way()# 1.16秒每循环137毫秒(平均标准时间。戴夫。7次运行,每次1个循环)
平均花费的时间大约是1.16秒,但是在这个例子中,我们使用一个数组作为存储对象。事实上,如果我们换成一个集合来存储经过重复数据消除的结果,性能会快得多:
def easy _ way():unique=set()for element in DUPLICATES:if element not in unique:unique . add(element)return unique % time it easy _ way()# 48.4 ms 11.6 ms per loop(mean STD .戴夫。7次运行,每次10个循环)
平均耗时约48毫秒,提升明显。这是因为集合和数组的内部数据结构完全不同。集合使用的是哈希表,所以速度会比列表快很多,但是缺点是无序。
让我们来看看第二种方式:
2.直接对数组进行集合转化,然后再转回数组:
#第二种重复数据删除方法def fast _ way()返回列表(set (duplicates))耗时:
%timeit fast_way()# 14.2毫秒每循环1.73毫秒(平均标准时间。戴夫。7次运行,每次100个循环)
平均需要14毫秒。这种重复数据消除方式是最快的,但如前所述,该集合是无序的。当你把一个数组变成一个集合,然后变成一个列表,你就失去了原来列表的顺序。
如果现在需要保持原来的数组顺序,那么这种方法是不可取的。我该怎么办?
3.保留原有数组顺序的去重
使用dict.fromkeys()函数,您可以保持原始数组的顺序并删除重复的数组:
def save_order():返回列表(dict.fromkeys(DUPLICATES))
当然,这比简单地使用集合进行重复数据消除需要的时间要长一些:
%timeit save_order()# 39.5毫秒每循环8.66毫秒(平均标准时间。戴夫。7次运行,每次10个循环)
平均用时39.5毫秒,我觉得可以接受。毕竟保留了原数组的顺序。
但是只有Python3.6及以上版本支持dict.fromkeys()。
如果你是3.6以下的Python3.6版本,那么你可能要考虑第四种方式。
4. Python3.6以下的列表保留顺序去重
在Python3.6下,fromkeys函数实际上是存在的,只不过它是由集合提供的:
从集合导入OrderedDictdef save _ order _ below _ py36():返回列表(ordereddict . from keys(DUPLICATES))
耗时:
% time它save _ order _ below _ py36 () # 71.8ms每循环16.9ms(平均7次运行,每次循环10次的标准差)平均耗时约72ms,比Python3.6内置的dict.fromkeys()慢,因为OrderedDict是纯Python实现的。
这是我们文章的结尾。如果你喜欢今天的Python实用教程,请持续关注Python实用合集。
如有疑问,可在微信官方账号后台回复:加群,回答相应验证信息,进入互助群查询。
原创不容易。希望大家给我点个赞,看下面支持我继续创作。谢谢大家!
点击下方阅读原文可获得更好的阅读体验
Python实用合集(pythondict.com)
这不仅仅是一个宝藏
欢迎关注微信官方账号:Python实用合集
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。