【问题标题】:constructing a new hash from the given values从给定的值构造一个新的散列
【发布时间】:2014-09-30 21:58:49
【问题描述】:

我似乎迷失了试图实现以下目标,我尝试了一整天,请帮助

我有

h = {
    "kv1001"=> {
      "impressions"=>{"b"=>0.245, "a"=>0.754},
      "visitors"   =>{"b"=>0.288, "a"=>0.711},
      "ctr"        =>{"b"=>0.003, "a"=>0.003},
      "inScreen"=>{"b"=>3.95, "a"=>5.031}
    },
    "kv1002"=> {
      "impressions"=>{"c"=>0.930, "d"=>0.035, "a"=>0.004, "b"=>0.019,"e"=>0.010},
      "visitors"=>{"c"=>0.905, "d"=>0.048, "a"=>0.005, "b"=>0.026, "e"=>0.013},
      "ctr"=>{"c"=>0.003, "d"=>0.006, "a"=>0.004, "b"=>0.003, "e"=>0.005},
      "inScreen"=>{"c"=>4.731, "d"=>4.691, "a"=>5.533, "b"=>6.025, "e"=>5.546}
    }
}

我的目标

{
    "segment"=>"kv1001=a",
    "impressions"=>"0.754",
    "visitors"=>"0.711", 
    "inScreen"=>"5.031",
    "ctr"=>"0.003"
}, {
    "segment"=>"kv1001=b", 
    "impressions"=>"0.245", 
    "visitors"=>"0.288", 
    "inScreen"=>"3.95",
    "ctr"=>"0.003"
}, {
    "segment"=>"kv1002=a", 
    "impressions"=>"0.004" 
    #... etc
}

我的目标是创建一个带有“kv1001=a”的散列,即散列中的字母,并分配展示次数、访问者等键。示例 MY GOAL 的格式为 所以格式类型“kv1001=a”必须由hash本身构造,a是hash里面的字母。

我现在解决了这个问题

`data_final = []
h.each do |group,val|
  a = Array.new(26){{}}
  val.values.each_with_index do |v, i|
    keys = val.keys
    segment_count = v.keys.length
    (0..segment_count-1).each do |n|
      a0 = {"segment" => "#{group}=#{v.to_a[n][0]}", keys[i] => v.to_a[n][1]}
      a[n].merge! a0
      if a[n].count > 4
        data_final << a[n]
      end
    end
  end
end`

【问题讨论】:

  • 你试过什么?还不清楚您要实现什么,格式化哈希会有所帮助。
  • 你能详细说明一下规则吗?看来您正在尝试分离 ab 组件(这是用于 A/B 测试吗?)。但是cde 呢?
  • 我重新格式化了您的代码,以便您可以看到您的目标不是有效的哈希。你想让它成为一个哈希数组吗?
  • 您可能应该编辑问题以添加您的代码。

标签: ruby-on-rails ruby data-structures hash


【解决方案1】:

这是一个更简单的版本

h.flat_map do |segment, attrs| 
  letters = attrs.values.flat_map(&:keys).uniq
  # create a segment entry for each unique letter
  letters.map do |letter|
    seg = {"segment" => "#{segment}=#{letter}"}
    seg.merge Hash[attrs.keys.map {|key| [key,attrs[key][letter]]}]
  end
end

输出:

[{"segment"=>"kv1001=b",
  "impressions"=>0.245,
  "visitors"=>0.288,
  "ctr"=>0.003,
  "inScreen"=>3.95},
 {"segment"=>"kv1001=a",
  "impressions"=>0.754,
  "visitors"=>0.711,
  "ctr"=>0.003,
  "inScreen"=>5.031},
 {"segment"=>"kv1002=c",
  "impressions"=>0.93,
  "visitors"=>0.905,
  "ctr"=>0.003,
  "inScreen"=>4.731},
 {"segment"=>"kv1002=d",
  "impressions"=>0.035,
  "visitors"=>0.048,
  "ctr"=>0.006,
  "inScreen"=>4.691},
 {"segment"=>"kv1002=a",
  "impressions"=>0.004,
  "visitors"=>0.005,
  "ctr"=>0.004,
  "inScreen"=>5.533},
 {"segment"=>"kv1002=b",
  "impressions"=>0.019,
  "visitors"=>0.026,
  "ctr"=>0.003,
  "inScreen"=>6.025},
 {"segment"=>"kv1002=e",
  "impressions"=>0.01,
  "visitors"=>0.013,
  "ctr"=>0.005,
  "inScreen"=>5.546}]

【讨论】:

  • 感激不尽。我会在这里寻求最后的帮助。我有另一个 h 说 h2 完全一样。我必须将 h2 的段键转换为“impression_control”、“visitors_control”等,然后合并到段。更清楚地,在你的代码里面.. seg = {"segment" => "#{segment}=#{letter}"} seg.merge Hash[attrs.keys.map {|key| [key,attrs[key][letter]]}] 我想加一行 seg.merge Hash[attrs.keys.map {|key| [key,attrs_of_h2[key][letter]]}] 目标 some_array
  • @KB_enreach 一种技术是首先合并散列。您需要合并的不是顶级属性,而是二级属性。
猜你喜欢
  • 2014-07-27
  • 2011-10-06
  • 2019-12-02
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多