2017-06-20 134 views
-1

我有一個列表的列表:如何從列表中刪除重複的無序元素?

[[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]] 

我想,因爲元素[1,2,5] & [1,7]具有相同的元素和順序無關緊要刪除元素[2,1,5] & [7,1]

刪除這些元素的最快方法是什麼?

+2

您可能想要使用集合。 –

回答

4

您可以跟蹤set中已經看到的元素。您可以在之前對它們進行排序,以便「標準化」它們,從而忽略元素的順序。

>>> lst = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]] 
>>> seen = set() 
>>> unique = [] 
>>> for x in lst: 
...  srtd = tuple(sorted(x)) 
...  if srtd not in seen: 
...   unique.append(x) 
...   seen.add(srtd) 
...   
>>> unique 
[[1, 2, 5], [1, 7], [1, 6, 1], [2, 6]] 

不過,在將元素放入集合之前,必須先將已排序的元素轉換爲元組,然而列表不可排列。你也可以考慮使用frozenset代替,但不會有重複的元素項,如[1, 6, 1]

0

很好的工作,你可以做這樣的事情:

a = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]] 
b = [] 
for k in a: 
    if not sorted(k) in b: 
     b.append(k) 

>>> b 
[[1, 2, 5], [1, 7], [1, 6, 1], [2, 6]] 

PS:,如果你有重複在您的輸入列表中,請考慮在使用循環之前使用set()將其刪除。

編輯:

如果順序並不重要:

a = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]] 
b = [[1, 2, 5], [7, 1], [1, 6, 1], [2, 6], [2, 1, 5], [1, 7]] 

>>> list(map(list, set(tuple(sorted(k)) for k in a))) 
[[2, 6], [1, 1, 6], [1, 2, 5], [1, 7]] 

>>> list(map(list, set(tuple(sorted(k)) for k in b))) 
[[2, 6], [1, 1, 6], [1, 2, 5], [1, 7]] 
+2

但是如果'[7,1]'在'[1,7]'之前呢? –

+0

@MarkRansom在這種情況下,我的代碼將無法按預期工作。在這種情況下,我需要改變我的方法。 –

0

如下您可以創建的集列表:

my_list = [[1, 2, 5], [1, 7], [1, 6, 1], [2, 6], [2, 1, 5], [7, 1]] 
new_list = [frozenset(element) for element in my_list] 

爲了刪除重複,請執行以下操作:

cleaned_set = set(new_list) 

cleared_set是集合的集合,因此不包含重複項。

+0

這會將'[1,6,1]'變成'{1,6}' –

+0

是的,這僅適用於僅考慮列表中的元素而不考慮「基數」的情況。 – rodgdor