删除列表中的重复项
如何获得没有重复项的新列表?
[1, 2, 3, 1] → [1, 2, 3]
如何获取完全删除重复项的新列表?
[1, 2, 3, 1] → [2, 3]
如何获得没有重复项的新列表?
[1, 2, 3, 1] → [1, 2, 3]
如何获取完全删除重复项的新列表?
[1, 2, 3, 1] → [2, 3]
获取唯一项目集合的常用方法是使用集合
。集合是不同对象的无序集合。要从任何可迭代创建集合,只需将其传递给内置的 set()
函数即可。如果以后再次需要一个真实列表,可以同样地将集合传递给 list()
函数。
以下示例应涵盖您尝试执行的操作:
>>> t = [1, 2, 3, 1, 2, 3, 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
在Python 2.7中,从可迭代中删除重复项同时保持其原始顺序的新方法是:
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']
在Python 3.5中,OrderedDict有一个C实现。我的计时表明,这是Python 3.5的各种方法中速度最快和最短的方法。
在Python 3.6中,常规字典变得既有序又紧凑。(此功能适用于CPython和PyPy,但可能不适用于其他实现)。这为我们提供了一种新的最快的删除方式,同时保持了顺序:
>>> list(dict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']
在Python 3.7中,常规字典保证在所有实现中都排序。因此,最短和最快的解决方案是:
>>> list(dict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']