如何使用Ruby'计算平均值;s注入特性
我认为Ruby的如何使用Ruby'计算平均值;s注入特性,ruby,coding-style,iteration,average,Ruby,Coding Style,Iteration,Average,我认为Ruby的inject方法非常适合计算总和。但是如果我必须计算一个平均值并使用inject,我总是会得到这样的结果: total_ranked_query_results = @results.count { |result| result.class == RankedQueryResult } @results.inject(0.0) { |sum, result| result.class == RankedResult ? sum + result.average_precisio
inject
方法非常适合计算总和。但是如果我必须计算一个平均值并使用inject
,我总是会得到这样的结果:
total_ranked_query_results = @results.count { |result| result.class == RankedQueryResult }
@results.inject(0.0) { |sum, result| result.class == RankedResult ? sum + result.average_precision : sum } / total_ranked_query_results
因此,为了计算平均值,我基本上需要迭代两次以找出有多少个RankedResults
有没有更好的(rubyesque)方法来避免这种情况?在同一次迭代中进行计数和求和:
tmp = @results.inject([0.0, 0]) { |sum, result|
if RankedResult === result
[sum.first + result.average_precision, sum.last+1]
else
sum
end
}
tmp.first / tmp.last
或首先筛选集合:
tmp = @results.filter { |result| RankedResult === result }
tmp.inject(0.0) { |sum, result| sum+result.avergage_precision } / tmp.length
在第一个示例中,tmp.last计算不正确,仅当结果为RankedResult时才应增加