将一组键和一组值转换为Ruby中的哈希

时间:2009-04-11 20:30:11

标签: ruby arrays hash

我有两个这样的数组:

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

Ruby中是否有一种简单的方法可以将这些数组转换为以下哈希值?

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

这是我的方式,但我觉得应该有一个内置的方法来轻松做到这一点。

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

5 个答案:

答案 0 :(得分:52)

以下内容适用于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}

这似乎不适用于旧版本的Ruby(1.8.6)。以下内容应向后兼容:

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

答案 1 :(得分:10)

另一种方法是使用each_with_index:

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

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

答案 2 :(得分:6)

使用Array#transpose方法可以完成同样的操作。如果您使用的是Ruby版本> = 2.1 ,则可以利用方法Array#to_h,否则请使用您的老朋友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}

答案 3 :(得分:1)

答案 4 :(得分:0)

试试这个,这样后一个d会覆盖前一个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>