在ruby中反转散列和合并键

时间:2013-03-07 08:41:36

标签: ruby hash key reverse key-value

我的哈希是:

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

我想要反转键和值,并以导致

的方式合并新键
 res = { 'x' => ['a','b'], 'y' => ['a'], 'z' => ['b']}

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:3)

res = {}
h.each{|k, v| v.each{|vv| res[vv] ||= []; res[vv].push(k)}}

答案 1 :(得分: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"]}

答案 2 :(得分:0)

试试这个..

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

我测试了它,它正在工作。