从集合列表中设置

Set from a List of Sets

我在 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 中是否有更优雅的解决方案来解决这个问题。

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

unique_sets = {frozenset(s) for s in L}

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

unique_sets = set(map(frozenset, L))

如果您需要再次以可变集列表结束,您可以再次生成 set() 个对象的列表:

unique_set_list = [set(s) for s in unique_sets]

您可以将两者组合成一个列表理解,但会损失一点可读性:

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))]