2009-04-11 35 views
16

Tengo dos arreglos como:la conversión de una matriz de claves y una serie de valores en un hash en Ruby

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

¿Hay una manera sencilla en Ruby para convertir esas matrices en el siguiente de hash?

{ 'a' => 1, 'b' => 2, 'c' => 3 } 

Aquí está mi manera de hacerlo, pero siento que debería haber un método incorporado para hacer esto fácilmente.

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

Respuesta

50

las siguientes obras en 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} 

Esto parece no funcionar en versiones anteriores de Rubí (1.8.6). Lo siguiente debe ser compatible con versiones anteriores:

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

So Hash [keys.zip (values)] then? –

+0

Gracias, el método zip es probablemente lo que necesito ... pero la parte "Hash [zip]" me está dando un error en Ruby 1.8.6: "ArgumentError: número impar de argumentos para Hash". Y simplemente no puedo encontrar otra forma simple de cambiar 'comprimido' en un hash ... –

+0

Hmm. Estoy usando 1.8.7. Parece que esto podría haberse introducido en 1.8.7. Editaré la respuesta para una versión compatible con versiones anteriores. –

8

Otra forma es utilizar each_with_index:

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

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

El mismo se puede hacer usando Array#transpose método. Si está utilizando la versión de Ruby> = 2.1, se puede tomar la ventaja del método Array#to_h, de lo contrario usar su viejo amigo, 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

Prueba de esto, de esta manera este último d se sobreponen a la anterior 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> 
Cuestiones relacionadas