将一个包含数组的数组进行拆分,[0] 放到一个数组中,[1] 放到另一个数组中。

3

我有一个基本的数组 [[1,2],[2,4],[3,6]]

我想将它分成两个数组,以便...

a = [1,2,3]
b = [2,4,6]
3个回答

12

您可以像下面这样简单地使用Array#transpose

arr = [[1,2],[2,4],[3,6]]
# => [[1, 2], [2, 4], [3, 6]] 

a, b = arr.transpose
# => [[1, 2, 3], [2, 4, 6]] 
a
# => [1, 2, 3] 
b
# => [2, 4, 6] 

转置是最好的 +1 - Tanay Sharma
任何使用 transpose 的东西都会真正增加赞数 :) - SRack

1
c = [[1,2],[2,4],[3,6]]

你可以使用 map 和 insert 将内容插入到两个不同的数组中。
a = c.map{|x,y| x}
# => [1, 2, 3]

b = c.map{|x,y| y}
 #=> [2, 4, 6]

编辑 根据 @DaveMongoose 的评论,您也可以编写以下内容

a = c.map(&:first)
b = c.map(&:last)

2
这些也可以写成 a = c.map(&:first)b = c.map(&:last) - DaveMongoose

1

一种方法是使用像each这样的函数,并利用Ruby的自动数组分割:

ary = [[1,2],[2,4],[3,6]]
a = []
b = []

ary.each{|first,second| a << first; b << second}
# The entry [1,2] is automatically split into first = 1 and second = 2

如果你愿意,也可以使用each_with_object在单个方法调用中编写它。

a,b = ary.each_with_object([[],[]]) do |(first, second), result|
  result[0] << first
  result[1] << second
}

第三个选项是使用Array.zip
a,b = ary[0].zip(*ary[1..-1])

zip 将具有相同索引的条目配对组合在一起(正如您在此处所需)。这里的 * 是展开运算符,它将数组的数组解包成一系列参数。


5
这里最好的方法是“转置”。只有当没有更具体的方法可以完成工作时,才应该使用“each”。 - Sergio Tulentsev
@SergioTulentsev 是的!我完全忘记了transpose - DaveMongoose
不用转置也知道如何做这个是很好的。 - Sagar Pandya

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