Arrays 获取数组中数字的平均值,该数组是散列的值

Arrays 获取数组中数字的平均值,该数组是散列的值,arrays,ruby,hash,average,Arrays,Ruby,Hash,Average,在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 =

在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}
例如,有没有更好的方法可以做到这一点,而不必创建新的哈希

@bа 好啊这个怎么样:

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

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

p hash_2
下面给出的代码不需要另一个哈希

p hash_1.transform_values!{|x| x.sum/x.count}
结果

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

此解决方案与使用transform_值的解决方案不同!因为返回一个新的哈希对象

hash_1.map { |k,v| [k, v.sum / v.size] }.to_h

@如上所述,我进行了编辑。请再看一遍答案。它不会返回新的散列。如果我采用这种方式,那么我需要存储散列的结果_1。将_值{| x | x.sum/x.count}转换为一个新的散列,因为我需要数据是持久的。我不知道是否要修改原始散列。你想去吗?“如果你想这样做,那就是这样了。”伊曼纽尔我对我的答案做了一点修改,现在我相信它完全符合你的需要。我使用了转换值!,这是对原始散列的操作。是的,我想对原始散列进行更改,是的,通过添加感叹号,您的答案完美地解决了问题。谢谢你可能想在计算中加入一个.to_f,因为一堆整数的平均值通常不是一个整数。我不知道约翰的绰号是杰克。顺便问一下,马修在哪里?Fdiv对我来说是新事物。
hash_1.map { |k,v| [k, v.sum / v.size] }.to_h
def avg(arr)
  return nil if arr.empty?
  arr.sum.fdiv(arr.size)
end
h = { "Matthew"=>[2], "Mark"=>[3,6], "Luke"=>[2,3,4], "Jack"=>[] }
h.transform_values { |v| avg(v) }
  #=> {"Matthew"=>2.0, "Mark"=>4.5, "Luke"=>3.0, "Jack"=>nil}