2016-01-13 79 views
1

我將項目附加到列表中,而我不想要副本。刪除列表或字典中的重複項目

empty_list = [] 
empty_list.append('some_item') 

我想檢查列表中是否存在該項目的確切「副本」。如果是這樣,我想這個項目不要追加。

我覺得應該寫一個if語句來檢查項目是否已經存在於列表中。如果是這樣,請不要追加。

if 'some_item' not in empty_list: 
    empty_list.append('some_item') 
else: 
    pass 

有沒有這樣做的Python方法/函數?

編輯:這是一個重複的問題,它出現。但是,下面提供的答案似乎比上一個問題好。

+1

我想知道爲什麼代碼已經不符合您的需求?你可以寫出你的own_函數,這將足夠有效。 – ForceBru

+0

您的名單的順序是否重要?這些物品是否易碎?如果這些問題的答案是「否」和「是」,那麼你應該考慮使用'set'而不是列表。你會免費獲得重複刪除。 – mgilson

+2

這味道重複。 – erip

回答

4

要做到這一點有效地使用一組:

seen = set() 
L = [] 
if 'some_item' not in seen: 
    L.append('some_item') 
    seen.add('some_item') 
+4

只要項目可以被散列,它就可以工作。 – mgilson

+1

根據具體情況,可能根本不需要列表。 –

+0

@LevLevitsky爲了保留訂單,我寧願列表 – ShanZhengYang

1

直接的答案是使用一個集合,它會自動忽略重複。

my_set = set() 
... 
# iterate over your collection of 'some_item's, adding each one 
    my_set.add(some_item) 

# Finally, if you need the items in a list, rather than a set: 
my_list = list(my_set) 
+1

這破壞了訂購,但。 – wim

2

如果您在使用if 'some_item' not in my_list檢查則是O每次(N)搜索整個列表中。如果這些物品不一定是可排除的,那麼這可能仍然是最Python的方法。

你可以使用其他答案的建議,但是像這樣保持兩個集合有點煩人。

有些人使用OrderedDict作爲一個數據結構,其行爲像一個沒有重複的列表(您只需使用空值)。使用這種方法,您不必費心去檢查一個項目是否在那裏,您可以簡單地指定它,並且您不會得到任何重複項目。

該詞典本身的行爲將與迭代和成員資格測試的列表相同,如果您需要實際列表,則可以始終使用list(odict)創建一個列表。

output = list(OrderedDict.fromkeys(input_iterable))