鉴于以下简单数据集,对于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"]]
答案 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
您的数据是字符串这一事实非常不方便,我建议尽可能避免使用。