Ruby计算hash中元素的百分比
Ruby calculate the percentage of elements in hash
我有一个散列:
hash = {"str1"=>2, "str2"=>3, "str3"=>7}
我想计算散列中每个元素的百分比,这样我就可以得到一个这样的值:
{"str1"=>16.66% , "str2"=>25.00%, "str3"=>58.33%}
有什么想法吗?谢谢
您可以使用 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%"}
感谢@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 + "%"}
恕我直言,最佳答案不幸被删除:
total = hash.values.sum
hash.transform_values { |v| (v * 100.0 / total).round(2) }
散列方法 transform_values
相对不为人知,而这种情况正是它的用途。 (Ruby 2.4+ 或 Rails 4.2+)
@Ursus,如果你取消删除你的,我会删除它。请记住,这里的答案不仅适用于 OP,也适用于将来遇到相同问题的任何其他人。
我有一个散列:
hash = {"str1"=>2, "str2"=>3, "str3"=>7}
我想计算散列中每个元素的百分比,这样我就可以得到一个这样的值:
{"str1"=>16.66% , "str2"=>25.00%, "str3"=>58.33%}
有什么想法吗?谢谢
您可以使用 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%"}
感谢@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 + "%"}
恕我直言,最佳答案不幸被删除:
total = hash.values.sum
hash.transform_values { |v| (v * 100.0 / total).round(2) }
散列方法 transform_values
相对不为人知,而这种情况正是它的用途。 (Ruby 2.4+ 或 Rails 4.2+)
@Ursus,如果你取消删除你的,我会删除它。请记住,这里的答案不仅适用于 OP,也适用于将来遇到相同问题的任何其他人。