リストを引数として取る累積加重平均関数を実装しようとしています
[[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 のエントリが含まれるため、速度要件については不明です。基本的にブロック内の 2 つの値を追跡できるようにする必要があるため、次のように記述できる inject の拡張機能はありますか?
list.inject([0,0]){ |s1, s2, el| ...}
s1 と s2 は 0 に初期化されますか?