2012-03-31 57 views
1

在Python中,有沒有一種方法可以檢查列表中的重複項目,如果有,然後刪除它們?我在尋找這樣的事情:提前Python - 查找並銷燬列表中的重複項目

>>> def check(): 
>>> # put code here 
>>> list = ["foo", "foo", "bar"] 
>>> check(list) 
>>> list 
["foo", "bar"] 
>>> list2 = ["foo", "bar", "example"] 
>>> check(list2) 
>>> list2 
["foo", "bar", "example"] 

謝謝!

更新:

夥計們,我真的很新的編程和順序並不重要。所以for循環應該沒問題。不過謝謝你!

回答

2
>>>lis = ["foo", "foo", "bar"] 
>>>lis=list(set(lis)) 
>>>print(lis) 
['foo','bar'] 
+0

TYSM!你是一個救星! – bladezzz 2012-03-31 17:53:41

5

A set在這裏可能是一個更好的數據結構,因爲它首先不能有重複。您還可以使用它作爲一種工具來uniquify列表:

>>> lst = ["bar", "foo", "foo"] 
>>> set(lst) 
set(['foo', 'bar']) 
>>> list(set(lst)) 
['foo', 'bar'] 

或者如果你需要保存的順序,你可以保持你的數據在OrderedDict

>>> from collections import OrderedDict 
>>> d = OrderedDict.fromkeys(lst) 
>>> d 
OrderedDict([('bar', None), ('foo', None)]) 
>>> list(d) 
['bar', 'foo'] 

注意,出於性能的原因首先使用正確的數據結構會更理想,而不是使用原始列表並在每次操作之後使用其中一個轉換從中刪除重複項。

+0

好得多。在Python 2中,它只是'd.keys()',如果一個'dictview'工作(它通常會在'tuple'的位置),你可以在Python 3上使用相同的代碼。 – agf 2012-03-31 18:08:37

+0

@agf:我沒有看到什麼你的意思是「通常會在一個元組的位置」。 'KeysView'甚至不支持索引。 – 2012-03-31 18:20:25

+0

我試圖暗示你不能自己改變它,但你可以遍歷它,它有一個'len' - 它是一個不可變大小的可迭代容器。元組不是一個好例子:) – agf 2012-03-31 18:26:37

0

這空閒會話將顯示一個方便的Python的方式通過轉換爲一組,其中重複被轉換去除去除重複的項目。

>>>lis = ["foo", "foo", "bar"] 
>>>list(set(lis)) 
2

如果您需要保留的順序列表:

s = set() 
new_list = [v for v in old_list if not (v in s or s.add(v))] 

如果v尚未在s,然後s.add(v)評估和返回無,所以值取。否則,v in s爲真,並且該值被跳過。

如果您不關心訂單,只需使用set()就可以了。

0

如果使用python> 2.4

mylist = ["foo", "foo", "bar"]

myList = sorted(set(myList))

輸出

['bar', 'foo']