Ruby вычисляет процент элементов в хэше
У меня есть хэш:
hash = {"str1"=>2, "str2"=>3, "str3"=>7}
Я хочу рассчитать процентное содержание каждого элемента в хэше, чтобы я мог получить такой как это:
{"str1"=>16.66% , "str2"=>25.00%, "str3"=>58.33%}
Есть идеи по этому поводу? Спасибо
3 ответа
Решение
Вы можете использовать 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%"}
Лучший ответ ИМХО был к сожалению удален:
total = hash.values.sum
hash.transform_values { |v| (v * 100.0 / total).round(2) }
Метод хеширования transform_values
относительно неизвестно, и этот случай именно для этого. (Ruby 2.4+ или Rails 4.2+)
@ Ursus, если ты восстановишь свой, я удалю это. Имейте в виду, что ответы здесь предназначены не только для ОП, но и для всех, у кого есть такой же вопрос в будущем.
Спасибо @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 + "%"}