从集合列表中设置
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))]
我在 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))]