Ruby计算哈希中元素的百分比

时间:2017-05-09 14:29:37

标签: ruby-on-rails ruby percentage ruby-hash

我有一个哈希:

hash = {"str1"=>2, "str2"=>3, "str3"=>7}

我想计算哈希中每个元素的百分比,这样我就可以得到这样的一个:

{"str1"=>16.66% , "str2"=>25.00%, "str3"=>58.33%}

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:6)

您可以使用Enumerable#each_with_object

sum = a.values.inject(0, :+) # or simply a.values.sum if you're on Ruby 2.4+
#=> 12
a.each_with_object({}) { |(k, v), hash| hash[k] = v * 100.0 / sum }
#=> {"str1"=>16.666666666666668, "str2"=>25.0, "str3"=>58.333333333333336}

使用%

a.each_with_object({}) { |(k, v), hash| hash[k] = "#{(v * 100.0 / sum).round(2)}%" }
#=> {"str1"=>"16.67%", "str2"=>"25.0%", "str3"=>"58.33%"}

答案 1 :(得分:4)

遗憾的是,恕我直言删除了最佳答案:

total = hash.values.sum
hash.transform_values { |v| (v * 100.0 / total).round(2) }

散列方法transform_values相对未知,这种情况正是它的用途。 (Ruby 2.4+或Rails 4.2 +)

@Ursus,如果你取消删除你的话,我会删除它。请记住,此处的答案不仅适用于OP,也适用于将来有同样问题的其他人。

答案 2 :(得分:0)

感谢@AndreyDeineko的快速回答! 我尝试仅使用each方法(而非each_with_object进行此操作,因此这是答案。

sum = hash.values.sum
result = {}
hash.each { |k,v| result[k] = (v*100.00/sum).round(2)}

使用%

hash.each { |k,v| result[k] = (v*100.00/sum).round(2).to_s + "%"}