【问题标题】:Average values in an array of hashes with duplicate keys具有重复键的哈希数组中的平均值
【发布时间】:2019-02-25 18:26:39
【问题描述】:

我有一个哈希数组设置如下:

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

例如,我正在尝试找到一种方法来平均所有带有键 "1" 的哈希值。

有人可以帮忙吗?

【问题讨论】:

  • 以后,请考虑在选择答案之前等待更长时间。快速选择可能会阻止其他答案,并且有些人认为这对那些仍在研究答案的人是不尊重的。此外,您可能会发现等待一段时间(可能 >= 2 小时)会出现更好的答案。关键是不要着急。我知道你是 SO 新手。
  • 感谢您的反馈,我会采纳的。是的,堆栈溢出也是新的,所以我在问任何其他问题时一定要记住这一点。再次感谢。每个人都非常乐于助人

标签: arrays ruby hash average


【解决方案1】:

Array 现在有一个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)

【讨论】:

  • 最佳答案,imo。请注意,这假定数组不为空。
  • 很好地使用 sum,如果数组中有一个没有 '1' 键的散列,那么考虑会有一个 TypeError(我也遇到了同样的情况)。
  • @SebastianPalma 你可以使用{|h| h['1'].to_i } 来防范空值。
  • 这很好@steenslag
【解决方案2】:

考虑到 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。

【讨论】:

  • 太棒了,谢谢你,工作就像一种享受!经过反思,我的数组有点不同,每个键和值都在不同的哈希中,因为它们是由循环中的 .push 单独添加的,这意味着您的解决方案是映射“nil”(我的错)。我通过在你的 .then 之前添加 .compact 来删除 nils 来解决这个问题。再次感谢!
【解决方案3】:

我会这样做:

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 计算平均值。

【讨论】:

    【解决方案4】:

    给定数组(我更改了值以便于调试):

    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}
    


    使用的方法:

    【讨论】:

      【解决方案5】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 2015-06-26
        • 2013-03-22
        相关资源
        最近更新 更多