删除集合列表的重复项

Cov*_*ich 12 python list unique set duplicates

我有一套套装:

L = [set([1, 4]), set([1, 4]), set([1, 2]), set([1, 2]), set([2, 4]), set([2, 4]), set([5, 6]), set([5, 6]), set([3, 6]), set([3, 6]), set([3, 5]), set([3, 5])]
Run Code Online (Sandbox Code Playgroud)

(实际上在我的情况下是一个倒数元组列表的转换)

我想删除重复项来获取:

L = [set([1, 4]), set([1, 2]), set([2, 4]), set([5, 6]), set([3, 6]), set([3, 5])]
Run Code Online (Sandbox Code Playgroud)

但如果我尝试:

>>> list(set(L))
TypeError: unhashable type: 'set'
Run Code Online (Sandbox Code Playgroud)

要么

>>> list(np.unique(L))
TypeError: cannot compare sets using cmp()
Run Code Online (Sandbox Code Playgroud)

如何获得具有不同集合的集合列表?

the*_*eye 18

最好的方法是将您的集转换为frozensets(可以清除),然后使用它set来获取唯一的集合,如下所示

>>> list(set(frozenset(item) for item in L))
[frozenset({2, 4}),
 frozenset({3, 6}),
 frozenset({1, 2}),
 frozenset({5, 6}),
 frozenset({1, 4}),
 frozenset({3, 5})]
Run Code Online (Sandbox Code Playgroud)

如果你希望他们为集,那么你可以将它们转换回到set就像这

>>> [set(item) for item in set(frozenset(item) for item in L)]
[{2, 4}, {3, 6}, {1, 2}, {5, 6}, {1, 4}, {3, 5}]
Run Code Online (Sandbox Code Playgroud)

如果您还希望维护订单,同时删除重复项,那么您可以collections.OrderedDict像这样使用

>>> from collections import OrderedDict
>>> [set(i) for i in OrderedDict.fromkeys(frozenset(item) for item in L)]
[{1, 4}, {1, 2}, {2, 4}, {5, 6}, {3, 6}, {3, 5}]
Run Code Online (Sandbox Code Playgroud)