Ruby 如何将许多数组进行散列?

Ruby 如何将许多数组进行散列?,ruby,Ruby,我有一个如下所示的数组: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] hash = {} array[0].each.with_index do |value, i| hash[value] = [array[1][i], array[2][i]] end 我如何将其转换为类似以下内容的哈希: {1=>[6, 11], 2=>[7, 12], 3=>[8, 13], 4=>[9, 14],

我有一个如下所示的数组:

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
hash = {}

array[0].each.with_index do |value, i|
  hash[value] = [array[1][i], array[2][i]]
end
我如何将其转换为类似以下内容的哈希:

{1=>[6, 11], 2=>[7, 12], 3=>[8, 13], 4=>[9, 14], 5=>[10, 15]]

任何帮助都将不胜感激!尝试在Ruby中实现这一点。

这是一种非常奇怪的映射方式,但使用巧妙的方法签名并不难:

def pivot(keys, *values)
  keys.each_with_index.map do |key, i|
    [ key, values.map { |v| v[i] } ]
  end.to_h
end
然后你可以用splat来称呼它:

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

pivot(*a)
# => {1=>[6, 11], 2=>[7, 12], 3=>[8, 13], 4=>[9, 14], 5=>[10, 15]}

假设您的数组存储在变量名
array
下,我会这样做:

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
hash = {}

array[0].each.with_index do |value, i|
  hash[value] = [array[1][i], array[2][i]]
end

我有点喜欢
zip

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
a[0].zip(a[1].zip(a[2])).to_h
缺点是,它是硬连线的三个子阵列

这可以用splat来概括,所以

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
a[0].zip(a[1].zip(*a.drop(2))).to_h
屈服

{1=>[6, 11, 16], 2=>[7, 12, 17], 3=>[8, 13, 18], 4=>[9, 14, 19], 5=>[10, 15, 20]}

不需要任何额外的拉链级别。

一种pjs和ndn答案的混合:

arr.first.zip(arr[1..-1].transpose).to_h
同样非常相似(由CarySwoveland发布)在评论中:

arr.first.zip(arr.drop(1).transpose).to_h

对,我修好了。@moveson Ruby对这类事情很在行。如果你有很多代码来解决一个简单的问题,通常有更好的方法。感谢Matz和Ruby团队。比@tadman的优雅解决方案更简洁明了。我看到的唯一缺点是需要创建一个临时转置数组,但只有在初始数组非常大的情况下,这才应该是一个问题。您可以使用
foo.first.zip(foo.drop(1.transpose))(foo.drop(1.transpose))。to_h
。向我们展示您迄今为止的尝试,以及任何错误消息。你可以用一个splat来概括:
a[0].zip(a[1].zip(*a.drop(2))。天哪,我喜欢它@CarySwoveland我在编辑评论中给出了属性。