问题:合并具有相同指定键值的哈希数组,并求出其他键的平均值。
我的解决方案看起来很丑
数据:
require 'pp'
arr = [{:red=>346.0,
:unu=>10.0,
:used=>20147.0,
:acc_id=>550,
:percent=>0.01},
{:red=>0.0,
:unu=>1.0,
:used=>66.0,
:acc_id=>550,
:percent=>0.06},
{:red=>120.0,
:unu=>11.0,
:used=>166.0,
:acc_id=>550,
:percent=>10.06},
{:red=>1306.0,
:unu=>1.0,
:used=>13259.0,
:acc_id=>9999,
:percent=>0.0}]
在当前示例中,我们应该将 3 个哈希与 (:acc_id = 550) 合并,结果数组应包含两个哈希(合并哈希与 :acc_id = 550 和未触及的哈希与 :acc_id = 9999)
算法:
data = []
arr.group_by{|h| h[:acc_id] }.map {|_, arr_of_hashes|
sz = arr_of_hashes.size
if sz > 1
arr_of_hashes = arr_of_hashes.inject{|memo, el|
memo.merge(el) {|k, old_v, new_v| old_v + new_v}
}
arr_of_hashes.map {|k, v| arr_of_hashes[k] = v / sz}
end
data << arr_of_hashes if arr_of_hashes.is_a? Hash
data << arr_of_hashes[0] if arr_of_hashes.is_a? Array
}
pp data
预期结果: 合并哈希数组
[{:red=>155.33333333333334,
:unu=>7.333333333333333,
:used=>6793.0,
:acc_id=>550,
:percent=>3.376666666666667},
{:red=>1306.0,
:unu=>1.0,
:used=>13259.0,
:acc_id=>9999,
:percent=>0.0}]
... ... ...
最佳答案
我发现一个错误,你在 acc_id
上执行 /
和 +
重构了代码
让我们试试这个,但我想我们仍在改进它。
data = []
arr.group_by{|h| h[:acc_id] }.map {|_, arr_of_hashes|
sz = arr_of_hashes.size
result = Hash.new(0)
arr_of_hashes.map{ |hash| hash.map{ |k,v| result[k] += v/sz unless k == :acc_id } }
result[:acc_id] = arr_of_hashes.first[:acc_id]
data << result
}
关于ruby - 合并哈希数组 : value should be the average of merged values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50411099/