【问题标题】:Reversing a hash and merging keys in ruby在 ruby​​ 中反转哈希和合并键
【发布时间】:2013-03-07 08:41:35
【问题描述】:

我的哈希是:

h = { 'a' => ['x' ,'y'], 'b' => ['x','z']}

我想反转键和值并以某种方式合并新键

 res = { 'x' => ['a','b'], 'y' => ['a'], 'z' => ['b']}

有没有办法做到这一点?

【问题讨论】:

  • 认为人们会尝试使用您的示例进行测试,给出带有值的哈希值,而不是变量或占位符。
  • 对其进行了编辑,因此它可以使用字符串,我认为它比使用更复杂的对象更好
  • 好的,显示一些代码以查看您所在的位置也可能会有所帮助。我猜你有工作代码但对解决方案不满意。

标签: ruby hash key reverse key-value


【解决方案1】:
res = {}
h.each{|k, v| v.each{|vv| res[vv] ||= []; res[vv].push(k)}}

【讨论】:

    【解决方案2】:

    使用来自 Facets 的 Enumerable#map_by 的函数式方法:

    require 'facets'
    h.flat_map { |k, vs| vs.product([k]) }.map_by { |k, v| [k, v] }
    #=> {"x"=>["a", "b"], "y"=>["a"], "z"=>["b"]}
    

    【讨论】:

    • 知道为什么我会收到NoMethodError: undefined method 'map_by' for [["x", "a"], ["y", "a"], ["x", "b"], ["z", "b"]]:Array
    【解决方案3】:

    试试这个..

    rev = {}
    h.collect{|k, v| v.each{|vv| rev.has_key?(vv)? rev[vv] << k : (rev[vv] = [k])}}
    

    我测试过,它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2021-11-16
      • 2018-07-29
      • 2011-09-02
      • 2011-07-31
      相关资源
      最近更新 更多