ruby - 合并哈希数组 : value should be the average of merged values

标签 ruby algorithm

问题:合并具有相同指定键值的哈希数组,并求出其他键的平均值。

我的解决方案看起来很丑

数据:

require 'pp'

arr = [{:red=>346.0,
  :unu=>10.0,
  :used=>20147.0,
  :acc_id=>550,
  :percent=>0.01},
 {:red=>0.0,
  :unu=>1.0,
  :used=>66.0,
  :acc_id=>550,
  :percent=>0.06},
 {:red=>120.0,
  :unu=>11.0,
  :used=>166.0,
  :acc_id=>550,
  :percent=>10.06},
 {:red=>1306.0,
  :unu=>1.0,
  :used=>13259.0,
  :acc_id=>9999,
  :percent=>0.0}]

在当前示例中,我们应该将 3 个哈希与 (:acc_id = 550) 合并,结果数组应包含两个哈希(合并哈希与 :acc_id = 550 和未触及的哈希与 :acc_id = 9999)

算法:

data = []
arr.group_by{|h| h[:acc_id] }.map {|_, arr_of_hashes|
  sz = arr_of_hashes.size
  if sz > 1
    arr_of_hashes = arr_of_hashes.inject{|memo, el|
      memo.merge(el) {|k, old_v, new_v| old_v + new_v}
    }

    arr_of_hashes.map {|k, v| arr_of_hashes[k] = v / sz}
  end
  data << arr_of_hashes if arr_of_hashes.is_a? Hash
  data << arr_of_hashes[0] if arr_of_hashes.is_a? Array
}

pp data

预期结果: 合并哈希数组

[{:red=>155.33333333333334,
  :unu=>7.333333333333333,
  :used=>6793.0,
  :acc_id=>550,
  :percent=>3.376666666666667},
 {:red=>1306.0,
  :unu=>1.0,
  :used=>13259.0,
  :acc_id=>9999,
  :percent=>0.0}]

... ... ...

最佳答案

我发现一个错误,你在 acc_id 上执行 /+ 重构了代码 让我们试试这个,但我想我们仍在改进它。

data = []
arr.group_by{|h| h[:acc_id] }.map {|_, arr_of_hashes|
  sz = arr_of_hashes.size
  result = Hash.new(0)
  arr_of_hashes.map{ |hash| hash.map{ |k,v| result[k] += v/sz unless k == :acc_id } }
  result[:acc_id] = arr_of_hashes.first[:acc_id]
  data << result
}

关于ruby - 合并哈希数组 : value should be the average of merged values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50411099/

相关文章:

ruby-on-rails - Rails 应用程序的生命周期

ruby-on-rails - 错误无法在任何来源中找到 i18n-0.7.0

java - 时间复杂度修正冒泡排序

algorithm - 高维聚类 + 一些基本的东西

ruby-on-rails - 管理多个服务器上的不同resque队列

ruby - 我是否必须初始化类的所有成员变量?

Ruby Koans - about_arrays.rb

关于最小生成树的算法证明,我的答案正确吗?

algorithm - 我们可以将 Bellman-Ford 算法应用于无向图吗?

algorithm - 为什么以下算法的运行时间是 O(1) 而不是 Θ(1)?