获取数组中数字的平均值,它是哈希值

问题描述 投票:0回答:2

在Ruby程序中,我有一个散列,该散列具有普通的字符串作为键,并且值是数字数组:

hash_1 = {"Luke"=> [2,3,4], "Mark"=>[3,5], "Jack"=>[2]}

而且我正在寻找的结果是具有相同的哈希值,这些值成为数组内数字的平均值:

{"Luke"=> 3, "Mark"=>4, "Jack"=>2}

使其工作的一种方法可以是创建一个新的空hash_2,在hash_1上循环,然后在该块内将hash_2的键和数字的平均值分配为值。

hash_2 = {}

hash_1.each do |key, value|
  hash_2[key] = value.sum / value.count
end

hash_2 = {"Luke"=> 3, "Mark"=>4, "Jack"=>2}

例如,是否有更好的方法可以执行此操作,而不必创建新的哈希?

arrays ruby hash average
2个回答
0
投票

在迭代时修改哈希或任何其他可枚举不是一个好主意。如果必须的话,可以这样:

hash_1 = {"Luke"=> [2,3,4], "Mark"=>[3,5], "Jack"=>[2]}

hash_1.each { |k, v| hash_1[k] = v.sum.to_f / v.size } 
#=>{"Luke"=>3, "Mark"=>4, "Jack"=>2}

但是请记住,这可能导致意外行为。

我建议您使用#each_with_object创建具有替换值的新哈希:

hash_1.each_with_object({}) do |(k,v),o|
o[k] = v.sum / v.size
end
#=>{"Luke"=>3, "Mark"=>4, "Jack"=>2}

如果不想舍入结果,也可以在#to_f上使用v.sum


0
投票

@@Виктор好。怎么样:

hash_1 = {"Luke"=> [2,3,4], "Mark"=>[3,5], "Jack"=>[2], "Bobby"=>[]}

hash_2 = hash_1.reduce(Hash.new(0)){
  |acc, (k, v)|
  v.size > 0 ? acc[k] = v.sum / v.size : acc[k] = 0 
  acc
}

p hash_2
© www.soinside.com 2019 - 2024. All rights reserved.