【问题标题】:Fastest way to uniqify a list in Python在 Python 中统一列表的最快方法
【发布时间】:2011-02-01 09:56:13
【问题描述】:

在不保留顺序的情况下在 Python 中统一列表的最快方法?我在 Internet 上看到了许多复杂的解决方案 - 它们能比简单的更快吗:

list(set([a,b,c,a]))

【问题讨论】:

  • 为什么不对它们进行基准测试并找出答案?
  • 拍摄,如果您需要独特的,为什么还要从一组转换回来?
  • 2Chris:基准测试已经完成... 2Mike:因为列表 -> 列表

标签: python performance list


【解决方案1】:
set([a, b, c, a])

如果可能,请保持这种形式。

【讨论】:

  • 您可以迭代集合并测试集合中的成员资格,因此如果您不需要顺序,则无需转换回列表。
  • 值得注意的是,这里假设列表的所有元素都是hashable(见Pyhon glossary
  • 如果元素顺序在原始列表中很重要(我知道问题说不是,但可能对某些读者来说),这可能会破坏该顺序。 pylang 的回答提供了一个维持秩序的选项。
【解决方案2】:

去一个集合只适用于所有项目都是 hashable 的列表——例如在您的示例中,如果c = [],您提供的代码将引发异常。对于不可散列但可比较的项目,对列表进行排序,然后使用itertools.groupby 从中提取唯一项目,是最佳可用解决方案 (O(N log N))。如果项目既不是所有可散列的,也不是所有可比的,您唯一的“最后一搏”解决方案是O(N squared)

您可以编写一个函数来“唯一化”任何使用最佳可用方法的列表,方法是按顺序尝试每种方法,在第一个和第二个周围使用 try/except(以及结果的 returntry 子句的末尾,或者优雅地在try 语句的else 子句中;-)。

【讨论】:

    【解决方案3】:

    Peter Bengtsson 的 updated post 提出了在 Python 3.6+ 中创建唯一项列表的两种最快方法是:

    # Unordered (hashable items)
    list(set(seq))
    
    # Order preserving
    list(dict.fromkeys(seq))
    

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 2012-11-16
      • 2010-10-08
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多