获得不能更有效地交叉的所有集合的联盟

时间:2015-09-28 12:27:19

标签: python

我想获得两组frozensets的联合。我只对不相交的frozensets联合感兴趣。另一种看待它的方式是,我只对长度等于frozensets两者总长度的联合感兴趣。理想情况下,我想忽略任何不相互交叉的frozensets以获得大规模的加速。我希望很多frozensets至少有一个共同的元素。这是我到目前为止在python中的代码。我希望尽可能快,因为我正在使用大型数据集。 frozensets中的每一个都不超过20个元素,但在集合中总共会有大约1,000个元素。所有数字都在0到100之间。如果允许我的程序运行得更快但我不想要任何重复的元素并且顺序并不重要,我可以转换为其他类型。

sets1 = set([frozenset([1,2,3]),frozenset([4,5,6]),frozenset([8,10,11])])
sets2 = set([frozenset([8,9,10]),frozenset([6,7,3])])
newSets = set()
for fset in sets1:
    for fset2 in sets2:
        newSet = fset.union(fset2)
        if len(newSet) == len(fset)+len(fset2):
            newSets.add(frozenset(newSet))

正确的输出是

set(frozenset([1,2,3,8,9,10]),frozenset([4,5,6,8,9,10]),frozenset([8,10,11,6,7,3]))

1 个答案:

答案 0 :(得分:1)

sets1 = set([frozenset([1,2,3]),frozenset([4,5,6]),frozenset([8,10,11])])
sets2 = set([frozenset([8,9,10]),frozenset([6,7,3])])




union_ = set()

for s1 in sets1:
    for s2 in sets2:
        if s1.isdisjoint(s2):
            union_.add(s1 | s2)


print(union_)



 {frozenset({3, 6, 7, 8, 10, 11}), frozenset({1, 2, 3, 8, 9, 10}), frozenset({4, 5, 6, 8, 9, 10})}