繁体   English   中英

从 Python 列表中删除重复项的更好解决方案

[英]Better solution for removing duplicates from a Python list

我有两个函数可以从列表中删除重复项:

def solution1(a: List):
    seen = set()
    result = []
    for item in a:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

def solution2(a: List):
    result = []
    for item in a:
        if item not in result:
            result.append(item)
    return result

我从这个 SO 问题中得到了solution1 1。 它的时间和空间复杂度是O(n)

我相信solution2的空间复杂度也为O(n) 时间复杂度是多少? for循环是O(n)但我不确定in语句,因为result的长度不如输入a大。 它也只是O(n)吗?

最后,如果两种解决方案具有相同的时间和空间复杂性,是否被认为是“更好”? 我应该在面试中使用哪个?

看起来solution1使用更多空间(可能是O(2n) ,但我知道我们应该去掉前面的常量)并在更短的时间内完成(测试集成员资格比测试列表成员资格更快)。

我同意solution1的空间复杂度是O(2n) ,但它可以近似为O(n) ,这在空间方面与solution2大致相同。

然而,就时间效率而言, solution1 1 应该优于solution2 2,因为set数据结构的查找时间( if item not in seen:中:)大致为O(1) ,而常规 python 列表的查找时间( if item not in result: ) 是O(n) 所以面试的时候用solution1会更好

您可以在这里查看有关 Python 数据结构的时间复杂度的更多信息https://wiki.python.org/moin/TimeComplexity

第二个答案实际上大于 O(n) - 它更像是 O(n^2)。 这是因为if item not in result的时间复杂度取决于列表result中元素的数量,即它是O(n) 请参阅此答案以获取解释: Complexity of *in* operator in Python

这就是第一个答案更好的原因:它使用setdictionary ,其时间复杂度(最多)是常数时间。

使用 set 删除重复项

这是一种方法:

dups = [10,20,30,40,50,10,20,50,60,80,90]
print (dups)
remove_dups = list(set(dups))
print(remove_dups)

output 将如下所示:

原清单:

[10, 20, 30, 40, 50, 10, 20, 50, 60, 80, 90]

Dups删除列表:

[40, 10, 80, 50, 20, 90, 60, 30]

使用最少的回顾来删除重复项

我还认为这可能会减少查找,并且比完整扫描列表更快,同时保留顺序。

[a for i,a in enumerate (x) if a not in x[:i]]

Output如下:

[10, 20, 30, 40, 50, 60, 80, 90]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM