我正在使用此代码计算某些数字的平均值 - 请注意,rankings
列已序列化并包含哈希:
@reviews.collect{|review| review.rankings[label].to_i}.sum.to_f/@reviews.length if @reviews.length > 0
此代码的缺点是:如果其中一个值为nil
,则平均值计算为好像它存在为零。问题基本上是@reviews.length
分母假设每个评论都有相关价值。
如何从分母中排除那些不计算的评论?
非常感谢您的回答。问题最终出现在分母上,即/@reviews.length
部分。当我在分子和分母上使用reject
时,等式停止除以总长度并开始除以(长度 - 没有nils)。
最终结果 - 2分[0和100]平均为50; [零和100]平均为100。
答案 0 :(得分:1)
Array#reject
救援。
@reviews.reject{|review| review.rankings[label].nil?}.collect{|review| review.rankings[label].to_i}.sum.to_f/@reviews.length if @reviews.length > 0
答案 1 :(得分:1)
我会采用这种方法(使用compact
来杀死nil
):
rankings = @reviews.map{ |review| review.rankings[label] }.compact
rankings.map(&:to_i).sum.to_f / rankings.count unless rankings.count == 0
答案 2 :(得分:1)
if @reviews.length > 0
@reviews.collect{|r| r.rankings[label]}.compact.map(&:to_f).sum / @reviews.length
else
0
end