我在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}
的长度最小(在其他单词{{1}没有重复)。
对于后续应用程序,我需要访问L_{1}
的元素。所以我不能使用L_{1}
选项。
使用frozenset
会出现错误set(L)
。
我想我可以使用循环结构解决它,但我想知道在Python中是否有更优雅的解决方案来解决这个问题。
答案 0 :(得分:6)
如果您想消除重复的集合,则需要将它们转换为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))]