是否
list(set(some_list))
如何从列表中删除重复项?(如果有影响,使用Python 3.3)
(编辑以回应一些评论...之前可能过于简洁)。
具体来说,
- 它的效率(主要是速度,但也包括内存)至少与编写自己的算法相当吗?显然,这是最简洁的代码
- 它是否可靠?是否存在任何导致其失败的情况? (已经提到了一个问题...列表项需要是可哈希的)
- 有没有更像Python的方法呢?
你展示的方法可能是最简单易懂的,这使它符合大多数Pythonic的定义。
如果你需要保留列表的顺序,你可以使用collections.OrderedDict
代替set
:
list(collections.OrderedDict((k, None) for k in some_list).keys())
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))]
(根据评论的建议,我把这个评论也作为回答。)
你自己的解决方案看起来很不错,而且非常符合Python的编程风格。如果你正在使用Numpy,你还可以这样做:new_list = numpy.unique(some_list)
。这个代码几乎“像一句话一样阅读”,这是我认为一个好的“Pythonic”的标准。
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']
list(set(...))
就可以了。fromkeys
,而且我忘了 list
只会返回键。你的答案比我的简单多了,点赞。 - Mark Ransom
set
对你的元素进行排序,那只是偶然。你不应该依赖它。 - Mark Ransom