Как рассчитать средние с помощью функции Ruby Inject - PullRequest
3 голосов
/ 27 января 2011

Я думаю, что метод 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 существует, чтобы вычислить среднее.

Есть ли лучший (рубиновый) способ избежать этого?

1 Ответ

3 голосов
/ 27 января 2011

Либо подсчет и сумма в одной итерации:

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
...