Python列表(设置(列表(...))以删除重复项

时间:2015-10-01 04:29:45

标签: python list set

list(set(some_list))

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

(编辑以解决一些评论......之前可能过于简洁了。)

具体地,

  • 在效率方面(主要是速度还是内存)至少是可比较的,如果不比写自己的算法更好;它显然是最简洁的代码
  • 可靠吗?任何破裂的情况? (已经提到过一个......列表项目需要可以清洗)
  • 有更多的Pythonesque方式吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:3)

(正如评论中所建议的那样,也将此评论添加为答案。)

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

答案 2 :(得分:1)

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

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

如果没有必要保留订单list(set(...))就好了。