从Ruby中的哈希创建平均数组

时间:2017-09-12 22:10:06

标签: ruby

所以我有如下的哈希:

grade_hash = {bill:[100,95,92],frank:[67,73,84]}

我正试图找到比尔和弗兰克的平均值。

我知道如果我做了类似的事情:

def average (grade_hash)
grade_hash.transform_values{|num| num.reduce(:+)/num.size}
end
然后,我可以拿出Bill或Franks的平均值。

我如何从所有价值中提取平均值(比尔和弗兰克的总和)?

我试图在最后做一个.each来迭代,但这似乎不起作用,因为我不想真正迭代我只想从每个创建的数组中获取总和然后找到一个平均。

思想?

2 个答案:

答案 0 :(得分:3)

试试这个

def average(grade_hash)
  grades = grade_hash.values.flatten
  grades.sum / grades.size.to_f
end

答案 1 :(得分:1)

def combined_average(grade_hash, *students)
  raise ArgumentError, "There must be at least one student" if students.empty?
  non_students = students - grade_hash.keys
  raise ArgumentError, "#{non_students} are not students" if non_students.any?
  arr = grade_hash.values_at(*students).flatten
  arr.sum.fdiv(arr.size).round(1)
end

grade_hash = {bill: [100, 95, 92], frank: [67, 73, 84], julie: [99, 99, 100] }

combined_average(grade_hash, :bill)                  #=> 95.7
combined_average(grade_hash, :frank)                 #=> 74.7
combined_average(grade_hash, :julie)                 #=> 99.3
combined_average(grade_hash, :bill, :frank)          #=> 85.2
combined_average(grade_hash, :bill, :frank, :julie)  #=> 89.9
combined_average(grade_hash, :bill, :mimi, :freddie)
  #=>ArgumentError: [:mimi, :freddie] are not students...
combined_average(grade_hash)
  #=> ArgumentError: There must be at least one student...
相关问题