0

次のようなハッシュが与えられた場合:

{ "key_1" => ["value1","value2","value3"], "key_2" => ["value4","value5"], ...}

次のようなハッシュを取得するにはどうすればよいですか。

{ "value1" => "key_1", "value2" => "key_1", "value3" => "key_1", "value4" => "key_2", "value5" => "key_2" }

私はこれを試しました:

Hash[original_hash.flat_map { |key, values| original_hash.map { |value| [value, key] } }]
4

4 に答える 4

4
hash.each_with_object({}) { |(key,values),h| values.each { |v| h[v] = key } }
于 2012-10-28T09:58:56.807 に答える
1

通常のようにハッシュを反復するだけです:

h = { "key_1" => ["value1","value2","value3"], "key_2" => ["value4","value5"]}
newh = {}
h.each do |key, vals|
  vals.each { |v| newh[v] = key }
end

p newh
#=> {"value1"=>"key_1", "value2"=>"key_1", "value3"=>"key_1", "value4"=>"key_2", "value5"=>"key_2"}
于 2012-10-28T09:50:20.307 に答える
0

このハッシュを考えると:

> h = { "key_1" => ["value1","value2","value3"], "key_2" => ["value4","value5"]}
=> {"key_1"=>["value1", "value2", "value3"], "key_2"=>["value4", "value5"]}

あなたがすることができます:

> h.map{ |k, v| v.map{ |f| { f => k }}}.flatten
=> [{"value1"=>"key_1"}, {"value2"=>"key_1"}, {"value3"=>"key_1"}, {"value4"=>"key_2"}, {"value5"=>"key_2"}]

更新された回答:

> h.inject({}){ |h, (k,v)| v.each{ |f| h[f] = k }; h }
=> {"value1"=>"key_1", "value2"=>"key_1", "value3"=>"key_1", "value4"=>"key_2", "value5"=>"key_2"}
于 2012-10-28T09:51:51.193 に答える