首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算两个列表字典之间的相似度最有效的方法是什么?

计算两个列表字典之间的相似度最有效的方法是什么?
EN

Stack Overflow用户
提问于 2020-01-27 19:04:44
回答 1查看 35关注 0票数 1

我想使用集合逻辑来计算精度。我将用一个例子来解释:

对于这两个字典:

代码语言:javascript
复制
d1 = {1: {'hello', 'goodbye'}, 2:{'sayonnara'}, 3:{'origami'}}
d2 = {1: {'goodbye'}, 2:{'hola', 'bye'}, 3:{'bird','origami','giraffe'}}

我想得到这样的结果:

代码语言:javascript
复制
{1: 0.5, 2: 0, 3: 0.3333333333333333}

我是这样做的:

代码语言:javascript
复制
from collections import defaultdict
acc=defaultdict(list)
for (k,v1) in d1.items():
    for (k,v) in d2.items():
        nb=len(v1.intersection(v))
        if (nb>0):
            print(nb)
            acc[k] = nb/ (abs(len(v) - len(v1))+1)
            print(acc)
        if k not in acc.keys():
            acc[k] = 0

还有比这更有效的解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-27 19:17:19

如果我们在假设两个字典将具有相同的键的情况下进行操作,这可以通过一个单循环的字典理解来完成:

代码语言:javascript
复制
print({k1: (len(v1.intersection(d2[k1])) / (abs(len(v1) - len(d2[k1])) + 1))
       for k1, v1 in d1.items()})

输出

代码语言:javascript
复制
{1: 0.5, 2: 0.0, 3: 0.3333333333333333}

为了安全起见,我们可以通过确保我们只考虑两个字典之间的公共密钥来推广这一点。

代码语言:javascript
复制
print({common_key: (len(d1[common_key].intersection(d2[common_key])) / (abs(len(d1[common_key]) - len(d2[common_key])) + 1))
       for common_key in d1.keys() & d2.keys()})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59929874

复制
相关文章

相似问题

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