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"]] 

注射很简单。 我经常在项目中实现一个通用的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 

使用带有哈希的注入将产生较差的性能(您在每次迭代时重新分配备注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 

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