Python 如何在一组冻结集中找到属于另一个冻结集的子集的所有冻结集?

Python 如何在一组冻结集中找到属于另一个冻结集的子集的所有冻结集?,python,set,tuples,Python,Set,Tuples,我很难找到这个问题的解决方案(如果之前有人问过的话),因为在搜索中很难解释 我有一套冷冻套装,比如: my_set = { frozenset({1, 2, 3}), frozenset({1, 2, 3, 4}), frozenset({1, 2, 3, 5}), frozenset({1, 3, 5}), frozenset({1, 2}) } 我想要所有的冻结集,它们是集合中任何其他冻结集的子集,具有一个函数get\u subsets,其输出如下:

我很难找到这个问题的解决方案(如果之前有人问过的话),因为在搜索中很难解释

我有一套冷冻套装,比如:

my_set = {
    frozenset({1, 2, 3}),
    frozenset({1, 2, 3, 4}),
    frozenset({1, 2, 3, 5}),
    frozenset({1, 3, 5}),
    frozenset({1, 2})
}
我想要所有的冻结集,它们是集合中任何其他冻结集的子集,具有一个函数
get\u subsets
,其输出如下:

subsets = get_subsets(my_set)
subsets == {
    frozenset({1, 2, 3}),
    frozenset({1, 3, 5}),
    frozenset({1, 2})
}
将返回真值。我怎么能得到这个?我以前有一组元组,但修改为冻结集,因为我以前使用touples,因为它们是可散列的。我还要求在不迭代集合的情况下执行此操作,因为在我的例子中,集合中有数十万项;现在我改为:


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

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

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)

在您的设备上测试此功能可以获得所需的结果。这绝不是完成任务所能编写的最好的代码,但它可以满足您的需要。

我尝试使用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)}
[(1, 3, 5), (1, 2), (1, 2, 3)]
使用itertools.composition:

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, 3, 5), (1, 2), (1, 2, 3)]

为什么
(1,)
不能解决您的问题?您是否尝试过编写任何代码,或者您只是喜欢其他人的代码?您显然知道如何使用集合,因为您已经构建了一个集合。你知道你要做的是一个集合运算,所以…(如果你知道我要说的是什么,只是想知道你是如何得到一组集合的,这有点棘手,你必须实际生成一组
frozenset
s。)而且,如果不在集合上迭代,真的没有办法做到这一点。如果不查看所有的X,就无法找到“所有X都是这样的Y”(当然,除非以相关的方式对值进行排序……但是对它们进行排序需要迭代)