0

私のハッシュは次のとおりです。

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

キーと値を逆にして、新しいキーを次のようにマージしたい

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

これを行う方法はありますか?

4

3 に答える 3

3
res = {}
h.each{|k, v| v.each{|vv| res[vv] ||= []; res[vv].push(k)}}
于 2013-03-07T08:50:52.703 に答える
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"]}
于 2013-03-07T08:49:05.307 に答える
0

これを試して..

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

私はそれをテストしました、それは働いています。

于 2013-03-07T09:15:51.710 に答える