我有一個列表的列表:如何從列表中刪除重複的無序元素?
[[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]
。
刪除這些元素的最快方法是什麼?
我有一個列表的列表:如何從列表中刪除重複的無序元素?
[[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]
。
刪除這些元素的最快方法是什麼?
您可以跟蹤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]
很好的工作,你可以做這樣的事情:
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]]
但是如果'[7,1]'在'[1,7]'之前呢? –
@MarkRansom在這種情況下,我的代碼將無法按預期工作。在這種情況下,我需要改變我的方法。 –
如下您可以創建的集列表:
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是集合的集合,因此不包含重複項。
這會將'[1,6,1]'變成'{1,6}' –
是的,這僅適用於僅考慮列表中的元素而不考慮「基數」的情況。 – rodgdor
您可能想要使用集合。 –