我在查找此问题的解决方案(如果之前已被问到)时遇到问题,因为在搜索中难以解释。
我有一套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因为它们是可以清洗的。我还要求在没有迭代集合的情况下这样做,因为在我的情况下,我的集合中有数十万个项目;现在我修改为:
最快的方法是什么(现在采用迭代)?
答案 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)
在您的套装上进行测试可获得所需的结果。这绝不是为完成工作而编写的最佳代码,但它可以满足您的需求。