从集合列表中设置

DBS*_*DBS -1 python set

我在Python工作.我有一个很大的列表L = [X_{1}, X_{2}, ....,X_{n}],每个X_{i}都是一组.对于i, j我们所拥有的一些不同的指数,这是可能的X_{i} = X_{j}.我想创建一个列表(或集合)L_{1} = [Y_{1}, Y_{2}, ... ,Y_{k}],使得该集合(在数学意义上){X_{1},..., X_{n}} = {Y_{1}, ..., Y_{k}}并且L_{1}具有最小可能的长度(在其他单词L_{1}中没有重复).

对于后续应用程序,我需要访问的元素L_{1}.所以我不能使用该frozenset选项.

使用set(L)会出错TypeError: unhashable type: 'set'.

我想我可以使用循环结构解决它,但我想知道在Python中是否有更优雅的解决方案来解决这个问题.

Mar*_*ers 6

如果要消除重复集,则需要将它们转换为frozenset()实例:

unique_sets = {frozenset(s) for s in L}
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是Python 3:

unique_sets = set(map(frozenset, L))
Run Code Online (Sandbox Code Playgroud)

如果您需要再次获得可变集的列表,则可以再次生成set()对象列表:

unique_set_list = [set(s) for s in unique_sets]
Run Code Online (Sandbox Code Playgroud)

您可以将两者合并为一个列表理解,但可读性稍有下降:

seen = set()
unique_set_list = [ms for ms, ims in ((s, frozenset(s)) for s in L)
                   if not (ims in seen or seen.add(ims))]
Run Code Online (Sandbox Code Playgroud)