如何在Ruby中找到哈希数组的平均值

3

我正在尝试找到数组中几个哈希的平均值,这些哈希看起来像这样:

[{"path"=>"/abcd.com", "time"=>0.503},
 {"path"=>"/abcd.com", "time"=>0.765},
 {"path"=>"/abcd.com", "time"=>0.553}]

这些数组按照路径进行分组,我想找出加载该路径所需的平均时间。

以下是我目前的进展:

 averages = grouped_data.each do |array|
   array.each do |hash|
     hash["time"].reduce(:+) \ hash.length
   end 
 end

我觉得它没能正常工作是因为哈希表中的时间是浮点数。所以,我尝试了一种解决方法,通过添加一个总数并不使用reduce,但是返回的total0

 averages = grouped_data.each do |array|
   total = 0
   array.each do |hash|
     hash["time"] += total \ hash.length
   end 
   return total
 end

我感激所有的帮助。谢谢!


(1) 这里的反斜杠是做什么的? total \ hash.length。 (2) 你的哈希表只包含一个条目。因此,hash.length将总是为1。 - user1934428
2个回答

3

试试这个:

array = [{"path"=>"/sale.html", "time"=>0.503}, {"path"=>"/sale.html", "time"=>0.765}, {"path"=>"/sale.html", "time"=>0.553}]
average = array.map { |x| x["time"] }.sum / array.size # 0.6070

您也可以直接在数组上使用sum

average = array.sum { |x| x["time"] } / array.size # 0.6070

3
使用块形式的 sum 方法:array.sum { |x| x["time"] }。该方法会将数组中每个元素的 "time" 属性相加并返回总和。 - Ilya
第一个错误提示为“对于浮点数未定义方法sum”,第二个错误提示为“对于数组未定义方法sum”。 - marie
@ShannonNolan 你是否尝试使用不同的哈希数组?我已经测试了上述数组并得到了结果。 - Ashik Salman
@ShannonNolan 你使用的 Ruby 版本是什么? - Aleksei Matiushkin
1
@ShannonNolan Enumberable#sum 方法是在 Ruby 版本 2.4.0 中添加的。(该方法在许多年前也已经在 ActiveSupport 中可用(即通常在 Rails 项目中)。)除非您有充分的理由不这样做,否则我建议您将 Ruby 版本更新到当前最新版本:2.5.1 - Tom Lord

1

我假设你的grouped_data结构,请确认。

grouped_data = [
                [
                 {"path"=>"/sale.html", "time"=>0.503},
                 {"path"=>"/sale.html", "time"=>0.765},
                 {"path"=>"/sale.html", "time"=>0.553}
                ],
                [
                 {"path"=>"/sales.html", "time"=>1.0},
                 {"path"=>"/sales.html", "time"=>1.0},
                 {"path"=>"/sales.html", "time"=>4.0}
                ]
               ]

如果您想要每条路径的平均值:
averages = grouped_data.map do |array|
 array.inject(0) do |sum, hash|
   sum + hash["time"]
   end.fdiv(array.size) 
end

 #=> [0.6070000000000001, 2.0]

或者使用路径和平均时间的哈希值:

avs = grouped_data.map { |array|
  array.inject({}) { |sum, hash|
    sum.merge(hash) { |k, o, n| k == 'time' ? o + n : o }
  }.map { |k, v| [k, k == 'time' ? v.fdiv(array.size) : v] }.to_h
}

 #=> [{ "path" => "/sale.html",  "time" => 0.6070000000000001 },
 #    { "path" => "/sales.html", "time" => 2.0 }]

如果这对您有用,我可以添加一些必要的解释。 - Sagar Pandya
你试过了吗?会出错...请发布完整可运行的代码。 - peter
@peter 我推断grouped_data是一个数组,其中每个数组都填充了哈希。我只是在等待OP的确认。我可能完全错了。 - Sagar Pandya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接