是
list(set(some_list))
从列表中删除副本的好方法?(Python 3.3,如果这重要的话)
(编辑以回应一些评论.可能以前太简洁了)。
具体来说,
发布于 2015-10-01 15:12:22
您展示的方法可能是最短的,也是最容易理解的;根据大多数定义,这将使它成为Pythonic。
如果需要保留列表的顺序,可以使用collections.OrderedDict
而不是set
list(collections.OrderedDict((k, None) for k in some_list).keys())
编辑:对于Python3.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)))
编辑:上面可以写成一个列表理解,有些人可能会认为更毕达通。
[k for k,_ in itertools.groupby(sorted(some_list))]
发布于 2015-10-02 09:21:49
(正如评论中所建议的那样,还添加了这个评论作为回答。)
在我看来,你自己的解决方案看上去很好,而且很吸引人。如果使用的是Numpy,也可以使用new_list = numpy.unique(some_list)
。这个或多或少的“读起来就像一个句子”,我相信这是一个很好的基准,是什么东西是“毕加索”。
发布于 2015-10-02 09:40:56
为了保持最短的顺序(从Python2.7开始):
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']
如果没有必要保留订单,list(set(...))
就可以了。
https://stackoverflow.com/questions/32879491
复制相似问题