【问题标题】:Python list(set(list(...)) to remove duplicatesPython list(set(list(...)) 删除重复项
【发布时间】:2015-12-29 00:43:32
【问题描述】:

list(set(some_list))

从列表中删除重复项的好方法? (如果重要,Python 3.3)

(针对某些 cmets 进行了编辑……之前可能过于简洁)。

具体来说,

  • 至少在效率(主要是速度,还有内存)方面是否比编写自己的算法更好;这显然是最简洁的代码
  • 可靠吗?任何情况下它都会中断? (已经提到过一个......列表项需要是可散列的)
  • 有没有更 Pythonesque 的方法?

【问题讨论】:

  • 是的,当然。那么你的问题是什么?
  • 您确定好的指标是什么?正在比较哪些替代方案?这是在时间复杂度和/或内存消耗方面吗?
  • 如果列表项不可散列,则不会。
  • 是否需要维护列表中项目的顺序?
  • @EelkeSpaak 值得回答。

标签: python list set


【解决方案1】:

您展示的方法可能是最短且最容易理解的;根据大多数定义,这将使它成为 Pythonic。

如果需要保留列表的顺序,可以使用collections.OrderedDict代替set

list(collections.OrderedDict((k, None) for k in some_list).keys())

编辑:从 Python 3.7(或 3.6,如果你信任的话)开始,不需要使用 OrderedDict;一个普通的dict 共享保留插入顺序的属性。所以你可以重写上面的:

list({k: None for k in some_list}.keys())

如果元素不可散列但可以排序,您可以使用itertools.groupby 删除重复项:

list(k for k,g in itertools.groupby(sorted(some_list)))

编辑:上面可以写成列表推导式,有些人可能认为它更像 Pythonic。

[k for k,_ in itertools.groupby(sorted(some_list))]

【讨论】:

    【解决方案2】:

    (如 cmets 中所建议,也添加此评论作为答案。)

    对我来说,您自己的解决方案看起来不错且非常 Pythonic。如果你使用 Numpy,你也可以使用new_list = numpy.unique(some_list)。这或多或少“读起来像一个句子”,我相信这始终是“Pythonic”的一个很好的基准。

    【讨论】:

      【解决方案3】:

      为了保持顺序最短(从 Python 2.7 开始):

      >>> from collections import OrderedDict
      >>> list(OrderedDict.fromkeys('abracadabra'))
      ['a', 'b', 'r', 'c', 'd']
      

      如果不需要保留订单list(set(...))就可以了。

      【讨论】:

      • 我不知道fromkeys,我忘记了list 只会返回密钥。你的答案比我的简单多了,+1。
      猜你喜欢
      • 2012-09-28
      • 2016-07-02
      • 2017-10-19
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多