删除列表中的重复项

  • 问题:
  • 我几乎需要编写一个程序来检查一个列表是否有任何重复项,如果有,它会删除它们并返回一个新的列表,其中包含未被复制/删除的项。这是我所拥有的,但说实话,我不知道该怎么办

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

  • 答案:
  • 获取唯一项集合的常见方法是使用set. 集合是无序的不同的对象的集合。要从任何iterable创建一个集合,只需将其传递给内置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]

    Starting with Python 3.7,内置字典也保证保持插入顺序,因此如果您使用的是Python 3.7或更高版本(或CPython 3.6),也可以直接使用:

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

    请注意,这可能需要先创建字典,然后再从中创建列表。如果您实际上不需要保持顺序,那么使用集合通常会更好,特别是因为它为您提供了更多的操作。退房this question获取更多详细信息和删除重复项时保留顺序的替代方法

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