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

22

我有两个这样的数组:

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个回答

56

以下内容在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]

2
那么就是 Hash[keys.zip(values)] 吗? - Kyle Cronin
谢谢,zip方法可能是我需要的...但是在Ruby 1.8.6中,“Hash[zipped]”部分会给我一个错误:“Hash的参数数量为奇数”。我就是想不出另一种简单的方法将'zipped'转换成哈希表... - Paige Ruten
嗯,我正在使用1.8.7版本。看起来这可能是在1.8.7版本中引入的。我会编辑答案以获得向后兼容的版本。 - Brian Campbell
这很棒。可惜在旧版本的Ruby中你必须使用*和flatten函数来压缩zip文件。:( - allyourcode

10

另一种方法是使用 each_with_index:

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

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

10
可以使用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}

太棒了。谢谢。我稍微编辑了一下代码,突出显示了根据你所使用的Ruby版本选择的部分。 - Joshua Pinter
太棒了。谢谢。我稍微编辑了一下代码,突出显示了根据你所使用的Ruby版本使用哪个版本。 - undefined
这种方法是否比下面展示的 .zip 方法更可取?例如,更高效等。 - Joshua Pinter
有没有想法,这种方法是否比下面展示的.zip方法更好?例如,性能更高等等? - undefined

0
在当前的Ruby中,keys.zip(values).to_h可能是最易读的简短解决方案。
参考资料:

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接