python中列表去重有哪几种方法,python中去除列表重复值用什么?
在开发中,重复列表是非常常见的需求,重复列表也是Python中常见的处理方法。list作为Python中最常用的数据结构,负责了Python中大部分的数据存储任务,但是Python本身并不满足相异度,也就是说有重复的可能,所以需要去掉这些重复的值。那么,当Python列表被重复删除时,你会怎么做呢?有许多方法可以消除列表的重复。这里有四种方法,并对它们的性能进行了比较。
我们先做一些简单的数据,生成100万个从0到99的随机数:
fromrandomimportrandrange
DUPLICATES=[rand range(100)for _ in range(1000000)]
接下来,尝试这4种重复数据消除方法中最简单直观的方法:
1.创建一个新数组,遍历原始数组,如果值不在新数组中,则将其添加到新数组中。
#第一种方式
defeasy_way():
唯一=[]
前元素副本:
ifelementnotinunique:
唯一.追加(元素)
return唯一
输入ipython并使用timeit计算其重复数据消除时间:
% timeiteasy _ way()
# 1.16秒137米循环(7次运行的平均标准偏差,1次循环)
平均花费的时间大约是1.16秒,但是在这个例子中,我们使用一个数组作为存储对象。事实上,如果我们换成一个集合来存储经过重复数据消除的结果,性能会快得多:
defeasy_way():
unique=set()
前元素副本:
ifelementnotinunique:
unique.add(元素)
return唯一
% timeiteasy _ way()
# 48.4毫秒11.6毫秒每循环(7次运行的平均标准偏差,10次循环)
平均耗时约48毫秒,提升明显。这是因为集合和数组的内部数据结构完全不同。集合使用的是哈希表,所以速度会比列表快很多,但是缺点是无序。
让我们来看看第二种方式:
2.直接对数组进行集合变换,然后返回数组:
#减肥的第二种方法
deffast_way()
returnlist(集合(重复项))
耗时:
%timeitfast_way()
# 14.2毫秒1.73毫秒循环(7次运行的平均标准偏差,100次循环)
平均需要14毫秒。这种重复数据消除方式是最快的,但如前所述,该集合是无序的。当你把一个数组变成一个集合,然后变成一个列表,你就失去了原来列表的顺序。
如果现在需要保持原来的数组顺序,那么这种方法是不可取的。我该怎么办?
3.保持重复数据消除的原始阵列顺序。
使用dict.fromkeys()函数,您可以保持原始数组的顺序并删除重复的数组:
defsave_order():
return list(dict . from keys(DUPLICATES))
当然,这比简单地使用集合进行重复数据消除需要的时间要长一些:
%timeitsave_order()
# 39.5毫秒8.66毫秒每循环(7次运行的平均标准偏差,10次循环)
平均用时39.5毫秒,我觉得可以接受。毕竟保留了原数组的顺序。
但是只有Python3.6及以上版本支持dict.fromkeys()。
如果你是3.6以下的Python3.6版本,那么你可能要考虑第四种方式。
4.Python 3.6下面的列表保留了重复数据删除的顺序。
在Python3.6下,fromkeys函数实际上是存在的,只不过它是由集合提供的:
fromcollectionsimportOrderedDict
defsave_order_below_py36():
return list(ordered dict . from keys(DUPLICATES))
耗时:
%timeitsave_order_below_py36()
# 71.8毫秒16.9秒循环(7次运行的平均标准偏差,10次循环)
平均耗时约72毫秒,比Python3.6内置的dict.fromkeys()慢,因为OrderedDict是纯Python实现的。
以上是四种Python列表去重方法。通过耗时的对比,他们的表现一目了然。希望以上方法对你学习Python有所帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。