2017-03-10 52 views
0

我需要從列表中刪除重複項,但返回相同的列表。 所以選項,如:刪除列表中的重複項,但返回相同的列表

return list(set(list)) 

不會爲我的工作,因爲它創造了一個新的列表來代替。

def remove_extras(lst): 
    for i in lst: 
    if lst.count(i)>1: 
     lst.remove(i) 
    return lst 

這裏是我的代碼,它適用於某些情況下,但我不知道爲什麼它不工作remove_extras([1,1,1,1]),因爲它返回[1,1]時1的計數應該> 1。

+5

首先,你永遠不應該(直到絕對必要)修改你迭代在一個循環的對象。 –

回答

2

在創建新列表之後,可以使用切片分配來替換列表的內容。在結果的情況下,爲了不要緊,你可以使用set

def remove_duplicates(l): 
    l[:] = set(l) 

l = [1, 2, 1, 3, 2, 1] 
remove_duplicates(l) 
print(l) 

輸出:

[1, 2, 3] 
+2

啊,打我吧。僅供參考,不需要'list'包裝:'l [:] = set(l)'將工作得很好(在內部,我認爲它是正確的,但它比明確的轉換更便宜)。 – ShadowRanger

+0

@ShadowRanger感謝您的評論,更新了答案。我認爲片分配需要一個列表,但任何迭代似乎工作。 – niemmi

+0

這適用於我,謝謝! – Silver

0

你可以做到這一點使用OrderedDict,同時保持列表的順序從而消除了重複。

>>> from collections import OrderedDict 
>>> itemList = [1, 2, 0, 1, 3, 2] 
>>> itemList[:]=OrderedDict.fromkeys(itemList) 
>>> itemList 
[1, 2, 0, 3] 

這有一個運行時:O(N)

+0

沒有將切片分配回'itemList',這實際上並不回答問題。你想'itemList [:] = OrderedDict.fromkeys(itemList)'。 – ShadowRanger

+0

@ShadowRanger,當然。我剛纔展示了它的工作原理。歸還它畢竟是一件容易的事。 –

+0

這是OP的唯一真正的問題;展示一種更好的獨立化方法是很好的,但是你需要回答這個問題(如何去除原來的''list'')。 – ShadowRanger