Ruby在数组中平均集合的最佳方法是什么?

时间:2009-05-18 23:25:14

标签: ruby

鉴于以下简单数据集,对于0 25 53和80集合的平均值的最佳方法是什么。

  [["0", "148.5"],
   ["0", "146.5"],
   ["0", "148.6"],
   ["0", "202.3"],
   ["25", "145.7"],
   ["25", "145.5"],
   ["25", "147.4"],
   ["25", "147.3"],
   ["53", "150.4"],
   ["53", "147.6"],
   ["53", "147.8"],
   ["53", "215.4"],
   ["80", "150.4"],
   ["80", "149.4"],
   ["80", "148.0"],
   ["80", "149.9"]]

2 个答案:

答案 0 :(得分:6)

注射足够简单。我经常在项目中实现一个通用的group_by方法来帮助这样的东西。

如果数据很大且性能问题,请考虑使用数字库或数据库。

data = [ ... ]

groups = data.inject({}) do |hash, pair| 
  hash[pair.first] ||= []
  hash[pair.first] << pair.last.to_f
  hash
end

groups.inject({}) do |hash, pair| 
  hash[pair.first] = pair.last.inject(0,&:+) / pair.last.size
  hash
end

答案 1 :(得分:1)

使用带有哈希的注入将产生较差的性能(您在每次迭代时重新分配备注var)。如果你在1.9上,Enumerable实现了方法group_by,它可以用来使代码更明显:

result = array.map{ |row| [row.first.to_i, row.last.to_f] }.group_by(&:first)
result.each_pair do |key, values|
  result[key] = values.average
end

Array#average很容易实现为

class Array
  def average
    inject(0.0) { |sum, e| sum + e } / length
  end
end

您的数据是字符串这一事实非常不方便,我建议尽可能避免使用。