【问题标题】:Intersecting two Dictionaries and getting average scores相交两个字典并获得平均分数
【发布时间】:2021-07-23 05:13:50
【问题描述】:

我有 2 个 python 字典,每个字典都有一个城市名称和该城市的分数。 我需要比较两个字典才能找到得分最高的城市。因此,为此,我首先将两个字典相交以获得共同的城市。这就是我面临的问题。 例如,假设这两个字典是:

d1 = {"delhi": 40, "Jaipur": 50, "Gurgaon": 10}
d2 = {"Jaipur(Rajasthan)": 30, "Gurugram(Gurgaon)": 25}

这里因为括号或者城市有一些额外的字符串,所以交叉点失败。

所以我的问题是,如果一个城市部分存在于字符串中,有什么方法可以将其带入交叉路口?

另外,最后我需要给这座城市打个平均分。

我希望最终结果是:

d3 = {"gurgaon": 17.5((10 + 25) / 2), "jaipur": 40(80 / 2)}

我将如何实现这一目标?

【问题讨论】:

  • 在执行交叉逻辑之前,首先通过从键中删除不需要的部分来规范化字典,特别是因为最终结果不包含键中不需要的部分。
  • 是的,这就是我想知道的,我将如何做到这一点?在第一种情况下,“Jaipur”在括号外,在第二种情况下,“Gurgaon”在括号内。这样做的通用方法是什么?
  • d3 的值无效。你叫花车!
  • 我正在取普通城市的 2 个字典中的值的平均值。怎么无效?

标签: python-3.x dictionary intersection


【解决方案1】:

您可以创建规范化的字典,其中用于匹配的键是从原始键中提取的。由于输入字典的键中括号内和外括号的名称都可用于匹配,因此为规范化字典中的两个名称创建冗余键:

import re

n1, n2 = (
    {t.lower(): v for k, v in d.items() for t in re.findall('[^()]+', k)} 
    for d in (d1, d2)
)
print({k: (n1[k] + n2[k]) / 2 for k in n1.keys() & n2.keys()})

这个输出:

{'gurgaon': 17.5, 'jaipur': 40.0}

【讨论】:

    【解决方案2】:

    如果你只需要比较两个字典,你可以使用 filter 函数做这样的事情:

    def get_avg_scores(d1, d2):
        d3 = {}
        for key, item in d1.items():
            # Get match key d1 vs. d2
            d2_similar_key = list(filter(lambda x: key.lower() in x.lower(), d2.keys()))
    
            #Get match key d2 vs. d1
            d2_similar_key_rev = list(filter(lambda x: x.lower() in key.lower(), d2.keys()))
    
            # Keep the simplest key (to avoid bracets in d3)
            if len(d2_similar_key) > 0:
                d3[key] = (item + d2[d2_similar_key[0]])/2
            if len(d2_similar_key_rev) > 0:
                d3[d2_similar_key_rev[0]] = (item + d2[d2_similar_key_rev[0]])/2
    
    
        return d3
    
    d3 = get_avg_scores(d1, d2)
    

    【讨论】:

    • 我放的上述词典是否运行过?它给了我错误。获取匹配键 d2 vs. d1 部分是空的,即使有匹配对吗?
    • 抱歉,出现错误。已编辑!
    • 此答案假定 d1 中的键从不包含括号,但情况可能并非如此。在循环中使用in 运算符也是低效的,使得时间复杂度不必要地呈二次方。
    • 好吧,如果 d1 有括号,它就可以工作(因为我正在检查 d1 vs. d2 和 d2 vs.d1)。我同意如果字典包含数千个键,此解决方案可能效率低下。有时编写不可读的代码在将来很难维护。如果执行时间不长,我更喜欢始终保持简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多