2013-07-08 1 views
8

値。現在、私はそれを変換するために次のことをやっている:配列とハッシュを反転させると、私はこのような私のハッシュを書いているのオーサリングを容易にするため

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素敵なユースケース私は今日「#サイクル」を見てきました。どうもありがとうございました。 –

関連する問題