Làm thế nào để xây dựng một hàm băm Ruby từ hai mảng có kích thước bằng nhau?


92

Tôi có hai mảng

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

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

tôi muốn

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

Bất kỳ cách nào để làm điều này?

Câu trả lời:


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

... chết tiệt, tôi yêu Ruby.


3
Nó khá rõ ràng nhưng nếu ai đó đang thắc mắc, nếu bạn muốn lấy các mảng ban đầu từ hàm băm mới, bạn có thể gọi h.keysh.values.
bhaity

38

Chỉ muốn chỉ ra rằng có một cách dễ dàng hơn một chút để làm điều này:

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

Phải đồng ý về phần "Tôi yêu Ruby"!


16

Còn cái này thì sao?

[a, b].transpose.to_h

Nếu bạn sử dụng Ruby 1.9:

Hash[ [a, b].transpose ]

Tôi cảm thấy có a.zip(b)vẻ như alà chủ nhân và blà nô lệ, nhưng theo phong cách này thì chúng phẳng.


0

Chỉ vì lợi ích của sự tò mò:

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%
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.