如何找到所有frozensets是一组frozensets中另一个冻结集的子集?

时间:2018-03-30 03:07:40

标签: python set tuples

我在查找此问题的解决方案(如果之前已被问到)时遇到问题,因为在搜索中难以解释。

我有一套frozensets,比如:

my_set = {
    frozenset({1, 2, 3}),
    frozenset({1, 2, 3, 4}),
    frozenset({1, 2, 3, 5}),
    frozenset({1, 3, 5}),
    frozenset({1, 2})
}

我希望所有frozensets都是集合中任何其他冻结集的子集,其函数为get_subsets,其输出如下:

subsets = get_subsets(my_set)
subsets == {
    frozenset({1, 2, 3}),
    frozenset({1, 3, 5}),
    frozenset({1, 2})
}

将返回True。我怎么能得到这个?我之前有一组元组,但修改为frozensets,因为我之前使用的是touples因为它们是可以清洗的。我还要求在没有迭代集合的情况下这样做,因为在我的情况下,我的集合中有数十万个项目;现在我修改为:

最快的方法是什么(现在采用迭代)?

2 个答案:

答案 0 :(得分:2)

我尝试使用itertools,这是我的方法:

import itertools
my_set = {
    (1, 2, 3),
    (1, 2, 3, 4),
    (1, 2, 3, 5),
    (1, 3, 5),
    (1,2)
}

使用itertools.product:

print(set([ii[0] for ii in itertools.product(my_set,repeat=2) if ii[0]!=ii[1] and set(ii[0]).issubset(set(ii[1]))]))

输出:

{(1, 3, 5), (1, 2), (1, 2, 3)}

使用itertools.combination:

print(list(filter(None,set([i[0] if set(i[0]).issubset(i[1]) else i[1] if set(i[1]).issubset(set(i[0])) else None for i in itertools.combinations(my_set,r=2)]))))

输出:

[(1, 3, 5), (1, 2), (1, 2, 3)]

答案 1 :(得分:1)

如果我理解你的要求是正确的,那是不可能的。如果没有迭代,您无法进行必要的比较。考虑到这一点,我有一些可行的代码可以满足您的需求:

def get_subsets(SET):
my_List = [] #a list to hold the sets   
L = [] #another list for later
for Set in SET:
    New = set(Set)
    my_List.append(New)

for i in range(len(my_List)):
    for j in range(i+1,len(my_List)):

        if i+2 == len(my_List): #this is so the last element doesn't get double counted
            break

        if my_List[i].issubset(my_List[j]):
            L.append(tuple(my_List[i]))
        if my_List[i].issuperset(my_List[j]):
            L.append(tuple(my_List[j]))


return set(L)

在您的套装上进行测试可获得所需的结果。这绝不是为完成工作而编写的最佳代码,但它可以满足您的需求。