获取唯一项目集合的常见方法是使用set。套装有无序的的集合distinct对象。要从任何可迭代对象创建集合,您只需将其传递给内置的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
解决方案要求您的物品是hashable。这通常意味着它们必须是不可变的。如果您必须处理不可散列的项目(例如列表对象),那么您将不得不使用一种缓慢的方法,在这种方法中您基本上必须将嵌套循环中的每个项目与每个其他项目进行比较。