首页 > 解决方案 > 为合并的字典键提供综合分数

问题描述

我正在做一个需要说某个 ID 最有可能的项目。让我用例子来解释。我有 3 个字典,其中包含 ID 和他们的分数

例如:d1 = {74701:3、90883:2}

我这样分配百分比分数,

d1_p = {74701: 60.0, 90883: 40.0} ,这里的分数是(d1中键的值)/(值的总和)

同样,我还有 2 个其他词典

d2 = {90883: 2, 74701: 2} , d2_p = {90883.0: 50.0, 74701.0: 50.0}

d3 = {75853: 2}, d3_p = {75853: 100.0}

我的任务是为上述 3 个字典中的每个 ID 给出一个综合分数,然后通过取最高分来决定获胜者。我将如何在数学上为每个 ID 分配 0-100 之间的综合分数?

例如:在上述情况下,74701 需要成为明显的赢家。

我尝试给出平均值,但它失败了,因为我需要对出现在多个字典中的 ID 给予更多的偏好。例如:假设 74701 在 d1 和 d2 中占多数,有 30,40 个值。那么它的平均值将为 (30+40+0)/3 = 23.33 ,而 75853 仅出现一次且 100% 将得到 (100+0+0)/3 = 33.33 并将作为获胜者,这是错误的.

因此,有人可以在 python 中提出一种好的数学方法,并用代码给出这样的分数并决定多数吗?

标签: pythonpython-3.xdictionary

解决方案


与其尝试从不同的字典创建全局分数,因为您的主要目标是分析频率,我建议将所有数据汇总到一个字典中,这通常不太容易出错。假设我有 3 个字典:

a = {1: 2, 2: 3}
b = {2: 4, 3: 5}
c = {3: 4, 4: 9}

您可以通过对每个键的值求和来将这三个字典汇总为一个:

result = {1: 2, 2: 7, 3: 9, 4: 9}

这可以通过使用轻松实现Counter

from collections import Counter

result = Counter(a)
result.update(Counter(b))
result.update(Counter(c))
result = dict(result)

这将产生所需的摘要。如果您想要每个字典的不同权重也可以以类似的方式完成,那么要点是您不应该尝试从字典中获取信息作为单独的实体,而是将它们合并为一个统计数据。


推荐阅读