【问题标题】:Python get weighted mean of dict keys based on dict valuesPython根据dict值获取dict键的加权平均值
【发布时间】:2021-02-26 09:46:47
【问题描述】:

我正在尝试编写代码来查找我的 dict 中键的平均值,但基于 dict 值。因此,例如,对于:

d = {1:2, 2:1, 3:2}

字典键是:

[1,1,2,3,3]

我编写了以下代码,适用于上述小型数据集:

def get_median_of_dict_keys(d: dict) -> float:
    nums_list = []
    for k,v in d.items():
        if type(v) != int:
            raise TypeError
        nums_list.extend([k] * v)
    
    median = sum(nums_list) / len(nums_list)
    return median

当数据集很小时,这会得到我想要的值,但如果数据集是这样的:

d = {1:1_000_000_000_000_000, 2:2_000, 3:1_000_000_000_000_000}

我得到一个内存不足的错误,现在我想起来了,这是有道理的。

那么我怎样才能以一种同时处理那些更大的数据集的方式来构造上述函数呢?感谢您的宝贵时间。

【问题讨论】:

  • 我认为你的代码计算了平均值
  • d = {1:2, 2:1, 3:2} 的键是1,2,3 而不是1,1,2,3,3
  • 你能详细说明{1:2, 2:1, 3:2}应该是[1,1,2,3,3]吗?
  • 丹妮,对不起,我就是这个意思。
  • 铁钥匙,没错。同样,代码适用于小数字,但一旦它们变大,我就会耗尽内存。

标签: python dictionary key mean weighted-average


【解决方案1】:

您不需要创建列表,只需保留两个运行变量,一个保存总和,另一个保存元素数量:

def get_mean_of_dict_keys(d: dict) -> float:
    total = 0
    count = 0
    for k, v in d.items():
        total += k * v
        count += v

    mean = total / count
    return mean


print(get_mean_of_dict_keys({1: 2, 2: 1, 3: 2}))

输出

2.0

【讨论】:

  • 丹妮,非常感谢!在我问这个问题之后,我实际上开始考虑这个问题。感谢您的帮助!
【解决方案2】:

如果你想要平均数

这完全可以通过更大的数字来实现:

import numpy as np
d = {1:2000000000, 2:1000, 3:2000000000}
print(np.mean([i*d[i] for i in d]))

输出

2666667333.3333335

细分

[i*d[i] for i in d]

# is equivalent to:

lst = []
for i in d:
    lst.append(i*d[i])

【讨论】:

  • 很高兴为您提供帮助 :)
【解决方案3】:

您要查找的是weighted average

公式:

在哪里,

  • X<sub>1..n</sub> 是您字典中的键。
  • W<sub>1..n</sub> 是字典中的值。
  • 是加权平均值。

纯 Python 方法。

itertools.starmapoperator.mul 一起使用

from itertools import starmap
from operator import mul
d = {1:2, 2:1, 3:2}
sum(starmap(mul, d.items()))/sum(d.values())
# 2.0

如果你想使用NumPy

你可以在这里使用np.average

np.average([*d.keys()], weights=[*d.values()])
# 2.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2022-11-23
    • 2014-04-01
    • 2020-07-22
    • 1970-01-01
    相关资源
    最近更新 更多