Como construir um hash Ruby de dois arrays de tamanhos iguais?


92

Eu tenho duas matrizes

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

e

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

eu quero

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

Alguma maneira de fazer isso?

Respostas:


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

... droga, eu amo Ruby.


3
É bastante óbvio, mas se alguém estiver se perguntando, se você deseja obter os arrays originais do novo hash, basta chamar h.keyse h.values.
bhaity de

38

Só queria salientar que existe uma maneira um pouco mais limpa de fazer isso:

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

Tenho que concordar com a parte "Eu amo Ruby"!


16

Que tal este?

[a, b].transpose.to_h

Se você usa Ruby 1.9:

Hash[ [a, b].transpose ]

Eu sinto que a.zip(b)parece amestre e bescravo, mas nesse estilo eles são planos.


0

Só por curiosidade:

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%
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.