¿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?

Respuestas:


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

... maldita sea, amo a Ruby.


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"!


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.


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%
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.