将来自两个不同数组的元素与Ruby中的Hash配对

时间:2013-06-06 08:27:21

标签: ruby arrays hash

假设我有两个阵列:

a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]

我想得到的是哈希如下:

c = { 1 => [1, 6], 2 => [2, 7], 3 => [3, 8], 4 => [4, 9], 5 => [5, 10] }

到目前为止我遇到的唯一方法如下:

# Initialize the resulting Hash and fill in the keys.
c = {}
(a.length).times { |i| c[i + 1] = [] }

# Fill values
c.each_with_index do |(key), idx|
  c[key] = [a[idx], b[idx]]
end

Ruby有更好或更好的方法吗?

提前致谢。

4 个答案:

答案 0 :(得分:10)

功能方法:

Hash[a.zip(b).map.with_index(1) { |pair, idx| [idx, pair] }]
#=> {1=>[1, 6], 2=>[2, 7], 3=>[3, 8], 4=>[4, 9], 5=>[5, 10]}

只是为了好玩,如果你想建立自己的抽象:由于with_index,前一个片段比它应该更加冗长,首先它只适用于枚举器(不是枚举),其次是它的值作为第二个元素(作为第一个元素会更有用,这是大多数其他语言所做的)。我们能做什么?添加我们自己的Enumerable#indexed方法,相反的方法。此时我们还被迫添加Enumerable#to_h,所以最后我们能够编写这个纯粹的OOP,从左到右,声明性代码:

a.zip(b).indexed(1).to_h

答案 1 :(得分:8)

c = Hash[(1..a.size).zip(a.zip(b))]

这利用了Hash's key-value pair initializer

答案 2 :(得分:0)

  

Ruby有更好或更好的方法吗?

当然,确实如此!

a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]

c = a.zip(b).each.with_index.with_object({}) do |(arr, idx), memo|
  memo[idx + 1] = arr
end

c # => {1=>[1, 6], 2=>[2, 7], 3=>[3, 8], 4=>[4, 9], 5=>[5, 10]}

答案 3 :(得分:0)

你已经有了很多很棒的答案。我将添加两个仅用于多样性。

Hash[(0...a.size).map{ |i| [i+1, [a[i], b[i]]] } ]

(0...a.size).each_with_object({}) { |i, h| h[i+1] = [a[i], b[i]] }

我认为版本更容易阅读和理解。 :)但是,这是一个品味问题。

<强>更新

我caaaaanan停止。 :-)还有一个:

a.zip(b).each_with_object({}) { |p, h| h[h.size+1] = p }