删除列表中的重复内容

我需要写一个程序来检查一个列表是否有重复的内容,如果有,就把它们删除,然后返回一个新的列表,其中包括没有重复/删除的项目。这就是我的情况,但说实话,我不知道该怎么做。

def remove_duplicates():
    t = ['a', 'b', 'c', 'd']
    t2 = ['a', 'c', 'd']
    for t in t2:
        t.append(t.remove())
    return t
解决办法

获得一个唯一的项目集合的常用方法是使用set。集合是个无序的个对象的集合。要从任何可迭代的对象中创建一个集合,你可以简单地把它传递给内置的 set() 函数。如果你以后又需要一个真正的列表,你同样可以把这个集合传递给 list() 函数。

下面的例子应该涵盖了你所要做的任何事情。

>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> t
[1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> list(set(t))
[1, 2, 3, 5, 6, 7, 8]
>>> s = [1, 2, 3]
>>> list(set(t) - set(s))
[8, 5, 6, 7]

从这个例子的结果可以看出,原来的顺序没有被保持。如上所述,集合本身是无序的集合,所以顺序会丢失。当把一个集合转换回一个列表时,就会产生一个任意的顺序。

维持秩序

如果秩序对你很重要,那么你就必须使用不同的机制。一个非常常见的解决方案是依靠OrderedDict在插入时保持键的顺序。

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]

从 Python 3.7 开始,内置的字典也能保证保持插入的顺序,所以如果你在 Python 3.7 或更高版本 (或 CPython 3.6) 上,也可以直接使用它。

>>> list(dict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]

请注意,这样做有一个开销,那就是先创建一个字典,然后再从中创建一个列表。如果你实际上不需要保留顺序,你最好使用一个集合。查看 此问题 以了解更多细节,以及在删除重复内容时保留顺序的其他方法。


最后请注意,无论是 "set "还是 "OrderedDict"/"dict "的解决方案,都要求你的项目是hashable。这通常意味着它们必须是不可改变的。如果你必须处理不可散列的项目(例如列表对象),那么你将不得不使用一种缓慢的方法,基本上你将不得不在一个嵌套循环中把每个项目与其他项目进行比较。

评论(4)

这是一个单行代码:list(set(source_list))就可以了。

一个 "集合 "是不可能有重复的东西。

更新:一个保留顺序的方法是两行。

from collections import OrderedDict
OrderedDict((x, True) for x in source_list).keys()

这里我们利用OrderedDict记住了键的插入顺序,当某个键的值被更新时,不会改变它。我们插入True'作为值,但是我们可以插入任何东西,值只是不使用。(set'的工作方式很像一个`dict',也有忽略的值。)

评论(3)

如果你不关心顺序,就这样做。

def remove_duplicates(l):
    return list(set(l))

一个 "集合 "保证不会有重复的内容。

评论(1)