2013-07-08 19 views
8

Dla ułatwienia authoringu Piszę mój hash tak:Odwracanie hash z tablicy wartości

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

Ale wszędzie używam to muszę patrzeć klawisz odpowiadający wartości. Obecnie robię co następuje aby ją przekształcić:

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

co daje mi to, co chcę:

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

Ale czy istnieje prostszy sposób, aby osiągnąć ten sam cel?

Odpowiedz

10

Array # produkt jest dość hardkorowy do tego. :)

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 * znacznie lepiej .. :) –

+0

Myślę, że jest to czytelne i wydajne rozwiązanie w porównaniu do innych –

+0

Nice. Dziękuję Ci. – Johnsyweb

2

Próbowałem zrobić to wczoraj. To było moje rozwiązanie:

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

Myślę, że kod jest trudny do odczytania (w związku z tym trudny do utrzymania dla systemów produkcyjnych). Ale jest fajny i krótki :) (+1) – tessi

+2

Bardzo fajnie. 'v.zip ([k] * v.size)' może zostać uproszczone do 'v.zip ([k] .cycle)'. –

+0

@undur_gongor Przyjemny przypadek, który widziałem dzisiaj dla '# cyklu'. Dziękuję Ci bardzo. –

Powiązane problemy