Средние значения в массиве хэшей с дублирующимися ключами - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть массив хэшей, настроенный, как показано ниже:

array = [
  {"1" => 1, "2" => 2, "3" =>3},
  {"1" => 1, "2" => 2, "3" =>3}, 
  {"1" => 1, "2" => 2, "3" =>3}
]

Я пытаюсь найти способ усреднить значения всех хэшей, например, с помощью ключа "1".

Может кто-нибудь помочь?

Ответы [ 5 ]

0 голосов
/ 26 февраля 2019
array_data = [
  {"1" => 1, "2" => 2, "3" =>3}, 
  {"1" => 1, "2" => 2, "3" =>3}, 
  {"1" => 1, "2" => 2, "3" =>3}
]

class Hash
  def get_first
    self['1']
  end
end

class Array
  def avg
    sum / size
  end
end

avg = array_data.map(&:get_first).avg
0 голосов
/ 26 февраля 2019

Массив в настоящее время имеет метод sum, который принимает блок.Он в основном суммирует все, что возвращает блок:

array = [{"1" => 0, "2" => 2, "3" =>3}, {"1" => 1, "2" => 4, "3" =>6}, {"1" => 2, "2" => 6, "3" =>9}]
array.sum{|h| h['1']}.fdiv(array.size)
0 голосов
/ 25 февраля 2019

Учитывая версию Ruby, yield_self (тогда псевдоним) может работать:

[{ "1" => 10, "2" => 2, "3" =>3 },
 { "1" => 43, "2" => 2, "3" =>3 },
 { "1" => 4, "2" => 2, "3" =>3 }].map { |hash| hash.fetch('1', 0) }.then { |arr| arr.sum.fdiv(arr.size) }
# 19.0

Где (10 + 43 + 4) / 3 = 19.0, не ваш пример, но не просто 1 + 1 + 1.

0 голосов
/ 25 февраля 2019

Учитывая массив (я изменил значения для простоты отладки):

array = [{"1" => 0, "2" => 2, "3" =>3}, {"1" => 1, "2" => 4, "3" =>6}, {"1" => 2, "2" => 6, "3" =>9}]

Этот код отображает каждый ключ на среднее значение:

array.each_with_object(Hash.new{ |k,v| k[v] = [ ]}) { |h, hh| h.each { |k,v| hh[k] << v } }.transform_values { |k| k.sum.to_f/k.size }

#=>  {"1"=>1.0, "2"=>4.0, "3"=>6.0}


Методыиспользуется:
0 голосов
/ 25 февраля 2019

Я бы сделал что-то вроде этого:

array = [{"1" => 1, "2" => 2, "3" =>3},{"1" => 1, "2" => 2, "3" =>3},{"1" => 1, "2" => 2, "3" =>3}]
array.map { |hash| hash['1'] }.inject { |sum, el| sum + el }.to_f / array.size
#=> 1.0

array.map { |hash| hash['1'] } извлекает значения для всех элементов с ключом '1' ([1,1,1]) в этом примере.И .inject{ |sum, el| sum + el }.to_f / array.size вычисляет среднее значение.

...