递归,以便在Python中找到集合之间的共性

递归,以便在Python中找到集合之间的共性,python,recursion,set,Python,Recursion,Set,我有多个集合(数目未知),我想找出集合之间的共性,如果集合之间有匹配(80%匹配),我想合并这两个集合,然后从一开始就针对所有其他集合重新运行我拥有的新集合 例如: A : {1,2,3,4} B : {5,6,7} C : {1,2,3,4,5} D : {2,3,4,5,6,7} 然后A运行,A和B之间没有共同点,然后A和C运行,达到共同目标,因此我们现在有一个新的集合AC={1,2,3,4,5},现在我们比较AC和B,它没有达到阈值,但D达到阈值,因此我们有一个新的ACD集合,现在我们再

我有多个集合(数目未知),我想找出集合之间的共性,如果集合之间有匹配(80%匹配),我想合并这两个集合,然后从一开始就针对所有其他集合重新运行我拥有的新集合

例如:

A : {1,2,3,4}
B : {5,6,7}
C : {1,2,3,4,5}
D : {2,3,4,5,6,7}
然后A运行,A和B之间没有共同点,然后A和C运行,达到共同目标,因此我们现在有一个新的集合AC={1,2,3,4,5},现在我们比较AC和B,它没有达到阈值,但D达到阈值,因此我们有一个新的ACD集合,现在我们再次运行,现在我们与B达到了

我目前使用的是两个循环,但只有在比较两个集合时才能解决这个问题

为了计算公共性,我使用以下计算:

overlap = a_set & b_set
universe = a_set | b_set
per_overlap = (len(overlap)/len(universe))

我认为解决方案应该是一个递归函数,但我不太确定如何编写它。我对Python有点陌生,或者可能有一种不同的简单方法来实现这一点。

我相信这正是您想要的。这种复杂性是可怕的,因为每次匹配都会重新开始。不需要递归

def通用性(s1、s2):
重叠=s1和s2
宇宙=s1 | s2
返回(len(重叠)/len(宇宙))
def set_merge(s,阈值=0.8):
used_keys=set()
out=s.copy()
不完整=正确
虽然不完整:
不完整=错误
重新启动=错误
对于列表中的k1、s1(out.items()):
如果重新启动:
不完整=正确
打破
如果使用了k1键:
持续
对于s.items()中的k2和s2:
如果k1==k2或k2在使用的_键中:
持续
打印(k1,k2)
如果公共性(s1,s2)>=阈值:
out.setdefault(k1+k2,s1 | s2)
out.pop(k1)
如果k2输入输出:
out.pop(k2)
使用的_键。添加(k1)
使用的_键。添加(k2)
重新启动=真
打破
update({k:v代表k,v代表s.items(),如果k不在used_key})
返回
对于您的特定示例,它只合并A和C,因为任何其他组合都低于阈值

set_dict = {
    'A' : {1,2,3,4},
    'B' : {5,6,7},
    'C' : {1,2,3,4,5},
    'D' : {2,3,4,5,6,7},
}
set_merge(set_dict)
# returns:
{'B': {5, 6, 7},
 'D': {2, 3, 4, 5, 6, 7},
 'AC': {1, 2, 3, 4, 5}}

我相信这正是你想要的。这种复杂性是可怕的,因为每次匹配都会重新开始。不需要递归

def通用性(s1、s2):
重叠=s1和s2
宇宙=s1 | s2
返回(len(重叠)/len(宇宙))
def set_merge(s,阈值=0.8):
used_keys=set()
out=s.copy()
不完整=正确
虽然不完整:
不完整=错误
重新启动=错误
对于列表中的k1、s1(out.items()):
如果重新启动:
不完整=正确
打破
如果使用了k1键:
持续
对于s.items()中的k2和s2:
如果k1==k2或k2在使用的_键中:
持续
打印(k1,k2)
如果公共性(s1,s2)>=阈值:
out.setdefault(k1+k2,s1 | s2)
out.pop(k1)
如果k2输入输出:
out.pop(k2)
使用的_键。添加(k1)
使用的_键。添加(k2)
重新启动=真
打破
update({k:v代表k,v代表s.items(),如果k不在used_key})
返回
对于您的特定示例,它只合并A和C,因为任何其他组合都低于阈值

set_dict = {
    'A' : {1,2,3,4},
    'B' : {5,6,7},
    'C' : {1,2,3,4,5},
    'D' : {2,3,4,5,6,7},
}
set_merge(set_dict)
# returns:
{'B': {5, 6, 7},
 'D': {2, 3, 4, 5, 6, 7},
 'AC': {1, 2, 3, 4, 5}}

为什么它必须是递归的?它不是-如果你有更好的想法,它将是伟大的
每重叠
AC
D
只有4/7。它不符合0.8阈值。您是否意识到您对问题的定义中可能存在陷阱(由“公共性”和
合并操作触发)?如果比较
A={1,2,3,4}
B={1,2,3,4,5}
C={1,2,3,4,6}
,程序将不会返回相同的结果,这取决于测试夫妇的顺序(在一种情况下是
AB
C
,在另一种情况下是
AC
B
)。因此,你想解决的问题可以有很多解决方案,这取决于你迭代对的顺序。为什么它必须是递归的?它不是-如果你有更好的想法,
AC
D
每重叠
只有4/7。它不符合0.8阈值。您是否意识到您对问题的定义中可能存在陷阱(由“公共性”和
合并操作触发)?如果比较
A={1,2,3,4}
B={1,2,3,4,5}
C={1,2,3,4,6}
,程序将不会返回相同的结果,这取决于测试夫妇的顺序(在一种情况下是
AB
C
,在另一种情况下是
AC
B
)。因此,您想要解决的问题可以接受许多解决方案,这取决于您迭代对的顺序。