首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归,以便在Python中找到集合之间的共性

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

Stack Overflow用户
提问于 2020-01-02 16:13:13
回答 1查看 46关注 0票数 1

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

例如:

代码语言:javascript
运行
复制
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个集合之间进行比较时,才能解决这个问题。

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

代码语言:javascript
运行
复制
overlap = a_set & b_set
universe = a_set | b_set
per_overlap = (len(overlap)/len(universe))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-02 17:33:50

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

代码语言:javascript
运行
复制
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,因为任何其他组合都低于阈值。

代码语言:javascript
运行
复制
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}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59560181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档