¿Cómo construir un hash Ruby a partir de dos matrices de igual tamaño?

92

Tengo dos matrices

a = [:foo, :bar, :baz, :bof]

y

b = ["hello", "world", 1, 2]

quiero

{:foo => "hello", :bar => "world", :baz => 1, :bof => 2}

Alguna forma de hacer esto?

maček
fuente

Respuestas:

203
h = Hash[a.zip b] # => {:baz=>1, :bof=>2, :bar=>"world", :foo=>"hello"}

... maldita sea, amo a Ruby.

jtbandes
fuente
3
Es bastante obvio, pero si alguien se pregunta, si desea obtener las matrices originales del nuevo hash, puede simplemente llamar h.keysy h.values.
bhaity
38

Solo quería señalar que hay una forma un poco más limpia de hacer esto:

h = a.zip(b).to_h # => {:foo=>"hello", :bar=>"world", :baz=>1, :bof=>2}

¡Tengo que estar de acuerdo en la parte de "Amo a Ruby"!

Lethjakman
fuente
16

¿Que tal este?

[a, b].transpose.to_h

Si usa Ruby 1.9:

Hash[ [a, b].transpose ]

Siento que a.zip(b)parece aamo y besclavo, pero en este estilo son planos.

Junichi Ito
fuente
0

Solo por curiosidad:

require 'fruity'

a = [:foo, :bar, :baz, :bof]
b = ["hello", "world", 1, 2]

compare do
  jtbandes { h = Hash[a.zip b] }
  lethjakman { h = a.zip(b).to_h }
  junichi_ito1 { [a, b].transpose.to_h }
  junichi_ito2 { Hash[ [a, b].transpose ] } 
end

# >> Running each test 8192 times. Test will take about 1 second.
# >> lethjakman is similar to junichi_ito1
# >> junichi_ito1 is similar to jtbandes
# >> jtbandes is similar to junichi_ito2

compare do 
  junichi_ito1 { [a, b].transpose.to_h }
  junichi_ito2 { Hash[ [a, b].transpose ] } 
end

# >> Running each test 8192 times. Test will take about 1 second.
# >> junichi_ito1 is faster than junichi_ito2 by 19.999999999999996% ± 10.0%
el hombre de hojalata
fuente