我正在尝试实现一个以列表为参数的累积加权平均函数
[[1000, 3.1], [500, 1.2], [800, 7.1], [1300, 8.88]]
并返回(此处四舍五入到小数点后 2 位)
[3.1, 2.47, 4.08, 5.81]
例如:2.47 = (1000 * 3.1 + 500 * 1.2) / 1500。
我目前已经使用以下代码解决了这个问题:
def cumulative_weighted_average(list)
cs = 0
qu = 0
res = list.inject([0]) do |s, el|
cs += el[0] * el[1]
qu += el[0]
s + [cs.to_f / qu]
end
res.shift
res
end
有没有更短(更紧凑)的方式来做到这一点?
编辑: 感谢以下答案!该列表平均包含大约 1000 个条目,因此不确定速度要求。由于我需要能够从本质上跟踪块中的两个值,是否有一些注入的扩展允许您编写
list.inject([0,0]){ |s1, s2, el| ...}
s1 和 s2 在哪里初始化为 0?