2016-03-13 54 views
3

我有一個Python列表:在Python列表抓住獨特的元組,不論順序

[ (2,2),(2,3),(1,4),(2,2), etc...] 

我需要的是某種功能,它降低了其獨特的成分......這將是,在上面所列內容:

[ (2,2),(2,3),(1,4) ] 

numpy的獨特並不完全做到這一點。我可以想辦法做到這一點 - 將我的元組轉換爲數字,[22,23,14,etc.],找到唯一的,並從那裏回來......但我不知道複雜性是否會失控。有沒有一個函數可以做我想用元組做的事情?


下面是代碼的示例演示該問題:

import numpy as np 

x = [(2,2),(2,2),(2,3)] 
y = np.unique(x) 

返回:Y:[2 3]

這裏是解決方案的實現即演示修復:

x = [(2,2),(2,2),(2,3)] 
y = list(set(x)) 

返回y:[(2,2),(2,3)]

+1

是否爲了此事? – zondo

+2

然而,你會*找到數字的唯一標識符*,只需*用元組*嘗試。你爲什麼認爲它會有所不同? – jonrsharpe

+0

@jonrsharpe,在元組上運行numpy;沒有工作。 – bordeo

回答

14

如果結果的順序並不重要,您可以將列表轉換爲一組(因爲元組是可哈希)和轉換設置回列表:

>>> l = [(2,2),(2,3),(1,4),(2,2)] 
>>> list(set(l)) 
[(2, 3), (1, 4), (2, 2)] 

如果順序很重要,日E要過濾重複的典型方式是這樣的:

>>> seen = set() 
>>> result = [] 
>>> for item in l: 
...  if item not in seen: 
...   seen.add(item) 
...   result.append(item) 
... 
>>> result 
[(2, 2), (2, 3), (1, 4)] 

最後,慢一點,多一點的hackish,你可以濫用的OrderedDict爲有序集:

>>> from collections import OrderedDict 
>>> OrderedDict.fromkeys(l).keys() 
[(2, 2), (2, 3), (1, 4)] 
6

使用set將刪除重複,並從它創建一個list算賬:

>>> list(set([ (2,2),(2,3),(1,4),(2,2) ])) 
[(2, 3), (1, 4), (2, 2)] 
3

set()將刪除所有重複,然後你可以把它回列表:

unique = list(set(mylist)) 

使用set(),豪ver,會殺了你的訂單。如果訂單的問題,你可以用一個列表理解來檢查,如果該值已經列表中較早存在:

unique = [v for i,v in enumerate(mylist) if v not in mylist[:i]] 

該解決方案是有點慢但是,這樣你就可以做這樣的:

unique = [] 
for tup in mylist: 
    if tup not in unique: 
     unique.append(tup) 
+0

雖然第二種解決方案對於大型列表來說太慢了,因爲'list .__ contains____是O(n)。 – timgeb

+0

除了查看它是否在列表中之外,是否有任何方法可以查看之前是否使用過某些東西? – zondo

+1

是的,存儲在集合中看到的東西:) - 區別在於該集合具有O(1)成員測試。 – timgeb