Pythom-删除列表中的重复项

发布于 2021-02-02 23:24:25

编写一个程序来检查列表中是否有重复项,如果删除了重复项,则将其删除,并返回一个包含未重复项/已删除项的新列表。这就是我所拥有的,但老实说我不知道​​该怎么办。

def remove_duplicates():
    t = ['a', 'b', 'c', 'd']
    t2 = ['a', 'c', 'd']
    for t in t2:
        t.append(t.remove())
    return t
关注者
0
被浏览
199
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    获取唯一项目集合的常用方法是使用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]
    

    请注意,这可能会产生一些开销,先创建字典,然后再从中创建列表。如果你实际上不需要保留订单,那么通常最好使用一组,特别是因为它可以为你提供更多操作。请查看此问题,以获取更多详细信息以及删除重复项时保留订单的其他方法。

    最后请注意,解决方案setOrderedDict/ dict解决方案都要求你的项目是可哈希的。这通常意味着它们必须是不变的。如果必须处理不可散列的项目(例如列表对象),则必须使用慢速方法,在这种方法中,你基本上必须将每个项目与嵌套循环中的所有其他项目进行比较。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看