我几乎需要编写一个程序来检查列表中是否有重复项,如果删除了重复项,则将其删除,并返回一个包含未重复项/已删除项的新列表。这就是我所拥有的,但老实说我不知道该怎么办。
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()
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在插入过程中依赖于保持键的顺序:
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解决方案都要求您的项目是可 哈希的 。这通常意味着它们必须是不变的。如果必须处理不可散列的项目(例如列表对象),则必须使用慢速方法,在这种方法中,您基本上必须将每个项目与嵌套循环中的每个其他项目进行比较。
dict