簡體   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