我有多个集合(数量未知),我想找到这些集合之间的共性,如果我在集合之间有匹配(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之间没有共性,然后它对C运行A,C达到通用目标,因此我们现在有一个新的集合AC = {1,2,3,4,5},现在我们将AC与B进行比较,它没有达到阈值,但D达到了阈值,因此我们有了一个新的ACD集合,现在我们再次运行,现在我们有了B的命中。
我目前正在使用2个循环,但只有当我在2个集合之间进行比较时,才能解决这个问题。
为了计算通用性,我使用了以下计算:
overlap = a_set & b_set
universe = a_set | b_set
per_overlap = (len(overlap)/len(universe))
我认为解决方案应该是递归函数,但我不太确定如何编写,我对Python还是个新手,或者可能有一种不同的、简单的方法来实现这一点。
发布于 2020-01-02 17:33:50
我相信这就是你想要的。复杂性是可怕的,因为它每次得到匹配时都会重新开始。不需要递归。
def commonality(s1, s2):
overlap = s1 & s2
universe = s1 | s2
return (len(overlap)/len(universe))
def set_merge(s, threshold=0.8):
used_keys = set()
out = s.copy()
incomplete = True
while incomplete:
incomplete = False
restart = False
for k1, s1 in list(out.items()):
if restart:
incomplete = True
break
if k1 in used_keys:
continue
for k2, s2 in s.items():
if k1==k2 or k2 in used_keys:
continue
print(k1, k2)
if commonality(s1, s2) >= threshold:
out.setdefault(k1+k2, s1 | s2)
out.pop(k1)
if k2 in out:
out.pop(k2)
used_keys.add(k1)
used_keys.add(k2)
restart = True
break
out.update({k:v for k,v in s.items() if k not in used_keys})
return out
对于您的特定示例,它只合并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}}
https://stackoverflow.com/questions/59560181
复制相似问题