2013-07-08 98 views
8

爲了便於創作的,我寫我的哈希值是這樣的:反轉與數組中的哈希值

h = { 
    :key1: [:val1, :val2, :val3], 
    :key2: [:val4, :val5, :val6] 
} 

但是無論我用它,我需要查找與值相關聯的密鑰。目前,我做以下改造它:

h = Hash[*{ 
    :key1: [:val1, :val2, :val3], 
    :key2: [:val4, :val5, :val6] 
}.map {|key, vals| vals.map {|val| [val, key]}}.flatten] 

這給了我什麼,我想:

{ :val1 => :key1, :val2 => key1, :val3 => key1, :val4 => key2, :val5 => :key2, :val6 => :key2 } 

但有一個簡單的方法來達到同樣的目標是什麼?

回答

10

陣列#產品是爲這個漂亮的壞蛋。 :)

h = { 
    key1: [:val1, :val2, :val3], 
    key2: [:val4, :val5, :val6] 
} 

p Hash[h.flat_map {|k,v| v.product [k]}] 
# {:val1=>:key1, :val2=>:key1, :val3=>:key1, :val4=>:key2, :val5=>:key2, :val6=>:key2} 
+2

* + 1 *好得多.. :) –

+0

我認爲這是一個可讀和高效的解決方案相比,其他 –

+0

尼斯。謝謝。 – Johnsyweb

2

昨天我試圖做到這一點。這是我的解決方案:

h = { 
key1: [:val1, :val2, :val3],  
key2: [:val4, :val5, :val6],  
} 
=> {:key1=>[:val1, :val2, :val3], :key2=>[:val4, :val5, :val6]} 

hp = {} 
=> {} 

h.each { |k, v| v.each{ |e| hp[e] = k } } 
=> {:key1=>[:val1, :val2, :val3], :key2=>[:val4, :val5, :val6]} 

hp 
=> {:val1=>:key1, 
:val2=>:key1, 
:val3=>:key1, 
:val4=>:key2, 
:val5=>:key2, 
:val6=>:key2} 
3
h = { 
    :key1 => [:val1, :val2, :val3], 
    :key2 => [:val4, :val5, :val6] 
} 

p Hash[h.flat_map{|k,v| v.zip [k]*v.size }] 
# >> {:val1=>:key1, :val2=>:key1, :val3=>:key1, :val4=>:key2, :val5=>:key2, :val6=>:key2} 
p Hash[h.flat_map{|k,v| v.zip [k].cycle }] 
# >> {:val1=>:key1, :val2=>:key1, :val3=>:key1, :val4=>:key2, :val5=>:key2, :val6=>:key2} 
+0

我認爲代碼很難閱讀(因此很難維護生產系統)。但它很酷且簡短:)(+1) – tessi

+2

非常酷。 'v.zip([k] * v.size)'可以簡化爲'v.zip([k] .cycle)'。 –

+0

@undur_gongor我今天看到'#cycle'的好用例。非常感謝你。 –