[英]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.