[英]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 。
这就是第一个答案更好的原因:它使用set
或dictionary
,其时间复杂度(最多)是常数时间。
这是一种方法:
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.