我有一个嵌套的哈希,看起来像这样:
main_hash = [[
{"a"=>{:x=>70.1}, "b"=>{:x=>97.17}, "c"=>{:x=>97.25}}],
[{"a"=>{:x=>70.05}, "b"=>{:x=>97.17}, "c"=>{:x=>97.25}}],
[{"a"=>{:x=>70.12}, "b"=>{:x=>97.17}, "c"=>{:x=>97.25}}],
[{"a"=>{:x=>70.08}, "b"=>{:x=>97.17}, "c"=>{:x=>97.23}}]]
我想最终得到一个具有相同键a...f的散列,每个键都有一个对应的原始散列值的平均值:
return_hash = {"a" => average of all the values[:x] corresponding to "a" in each hash,
"b" => average of all the values[:x] corresponding to "b" in each hash,
"c" => average of all the values[:x] corresponding to "c" in each hash}
我尝试使用merge
和map
,但有没有更有效的块可以实现这个结果?
到目前为止,我一直在走这条路:
keys = []
values = []
divider = main_hash.size
iteration = main.first.first.size
iteration.times do
sum = 0
keys << main_hash.first[0].first[0]
main_hash.each do |f|
f.each do |g|
sum += g.dig(cores.keys.first, :x)
g.shift
end
end
values << ((sum / divider).round(2))
ret_hash = keys.zip(values).to_h
3条答案
按热度按时间r8uurelv1#
基本上,你可以在这里做的就是将数组扁平化以删除子数组,然后将每个哈希键的所有值收集到一个数组中。
然后求每个数组的平均值。
也可以使用
Hash#merge!
:ulydmbyx2#
这将是有帮助的,看看你已经提出了什么解决方案,到目前为止,看看我们是否可以改善它。你可以使用
each_with_object
来尝试这样的操作:它将输出:
qyswt5oh3#
首先,我修改了
main_hash
,以表明计算平均值的值的数量不需要对所有键都相同(即,示例中的"a"
,"b"
和"c"
)。我还将
main_hash[2].first[:b][x]
更改为96.11
,因此所有“"b"
的值“都不相同。我将计算平均值如下(有点类似于@dlmb的解决方案,尽管我不构造数组)。
这里
transform_values
的接收器被发现等于以下。