2009-04-11 10 views
16

Ho due array come questo:Conversione di un array di chiavi e una serie di valori in un hash in Ruby

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 

C'è un modo semplice in Ruby per convertire quegli array nel seguente hash?

Ecco il mio modo di farlo, ma ho la sensazione che ci dovrebbe essere un metodo integrato per farlo facilmente.

def arrays2hash(keys, values) 
    hash = {} 
    0.upto(keys.length - 1) do |i| 
     hash[keys[i]] = values[i] 
    end 
    hash 
end 

risposta

50

le seguenti opere in 1.8.7:

keys = ["a", "b", "c"] 
values = [1, 2, 3] 
zipped = keys.zip(values) 
=> [["a", 1], ["b", 2], ["c", 3]] 
Hash[zipped] 
=> {"a"=>1, "b"=>2, "c"=>3} 

Questo non sembra funzionare in versioni precedenti di Rubino (1.8.6). Il seguente dovrebbe essere compatibile:

Hash[*keys.zip(values).flatten] 
+2

Quindi Hash [keys.zip (valori)], quindi? –

+0

Grazie, il metodo zip è probabilmente quello di cui ho bisogno ... ma la parte "Hash [zippato]" mi sta dando un errore in Ruby 1.8.6: "ArgumentError: numero dispari di argomenti per Hash". E proprio non riesco a capire un altro modo semplice di cambiare 'zippato' in un hash ... –

+0

Hmm. Sto usando 1.8.7. Sembra che questo potrebbe essere stato introdotto in 1.8.7. Modificherò la risposta per una versione compatibile con le versioni precedenti. –

8

Un altro modo è quello di utilizzare each_with_index:

hash = {} 
keys.each_with_index { |key, index| hash[key] = values[index] } 

hash # => {"a"=>1, "b"=>2, "c"=>3} 
5

lo stesso può essere fatto utilizzando Array#transpose metodo. Se si utilizza la versione di Ruby> = 2.1, si può prendere il vantaggio del metodo Array#to_h, altrimenti utilizzare il tuo vecchio amico, Hash::[]

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 
[keys, values].transpose.to_h 
# => {"a"=>1, "b"=>2, "c"=>3} 
Hash[[keys, values].transpose] 
# => {"a"=>1, "b"=>2, "c"=>3} 
0

Prova questa, in questo modo che quest'ultima d sovrascriverà quello precedente c

irb(main):001:0> hash = Hash[[[1,2,3,3], ['a','b','c','d']].transpose] 
=> {1=>"a", 2=>"b", 3=>"d"} 
irb(main):002:0> 
Problemi correlati