【问题标题】:How to calculate Averages with Ruby's Inject feature如何使用 Ruby 的 Inject 功能计算平均值
【发布时间】:2011-06-16 11:05:56
【问题描述】:

我认为 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_precision : sum } / total_ranked_query_results

所以我基本上必须迭代两次才能找出有多少RankedResults 才能计算平均值。

有没有更好的(rubyesque)方法来避免这种情况?

【问题讨论】:

    标签: ruby coding-style iteration average


    【解决方案1】:

    在同一迭代中进行计数和求和:

    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 计算不正确,只有当 result 是 RankedResult 时才应该增加
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多