python3列表去重,python数据去重的函数

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: