在Ruby中组合数组

时间:2016-10-31 10:02:45

标签: ruby

以下数组包含两个数组,每个数组有5个整数值:

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

我希望以这样的方式组合它们,即通过将索引0,1 ...的数值组合到4来生成五个不同的数组。

输出应该是这样的:

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

有没有最简单的方法呢?

4 个答案:

答案 0 :(得分:9)

transpose方法呢?

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

a.transpose
#=> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

此方法也可以在将来帮助您,例如:

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

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

答案 1 :(得分:5)

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
a.first.zip(a.last)

答案 2 :(得分:2)

如果您确定子阵列的长度相同,则可以使用Array#transpose

[[1,2,3,4,5],[6,7,8,9,10]].transpose
#=> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

作为奖励,它适用于超过2个阵列:

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

如果您不确定子阵列的长度是否相同:

[[1,2,3,4,5],[6,7,8,9], [10,11]].reduce(&:zip).map(&:flatten)
#=> [[1, 6, 10], [2, 7, 11], [3, 8, nil], [4, 9, nil], [5, nil, nil]]

在此示例中使用transpose会抛出IndexError。

答案 3 :(得分:1)

使用并行分配:

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