2012-10-28 275 views
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] } }] 
+0

記住相同的值可以爲不同的鍵設置。例如: {「key_1」=> [「value1」,「value2」,「value3」],「key_2」=> [「value4」,「value5」,「value1」]} –

回答

4
hash.each_with_object({}) { |(key,values),h| values.each { |v| h[v] = key } } 
+0

爲了讓多個鍵的值相同,可以使用'hash.each_with_object({}){|(key,values),h | values.each {| v | h [v] = [h.fetch(v,[]),key] .flatten}}'。 –

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"} 
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"} 
+0

我想單個散列值=>鍵。不是具有多個哈希的數組... –

+0

您可以這樣做:'h.inject({}){| h,(k,v)| v.map {| F | h [f] = k}; h}' – edouardbriere

+0

對散列圖進行映射和減少(注入)操作有些不對勁。這是一個聰明的解決方案。 – jmdeldin

0

鑑於你的哈希:

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

我把你的散列稱爲「哈希」,這樣我們就可以反轉它。反轉散列會切換鍵和值對。

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

inverseHash = Hash.invert 

所以,我叫倒轉了,「inverseHash」。如果你提出,這inverseHash,你會得到你的結果:

puts inverseHash 

上面的代碼輸出:

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