假设我有两个阵列:
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有更好或更好的方法吗?
提前致谢。
答案 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))]
答案 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 }