在 Ruby 中选择二维数组的列。

9
我有一个二维数组 A = [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]]. 我想按列访问该数组。类似于这样-
A[all][0]
-> [a1,b1,c1]

我该怎么做呢?

4个回答

12

使用#transpose方法按照以下方式操作:

A.transpose.each do |ary|
   # your code
end

根据您的评论,我建议使用Matrix类。创建Matrix对象后,您可以按行或按列访问其元素。

require 'matrix'

A = [['a1','a2','a3'],['b1','b2','b3'],['c1','c2','c3']]

mat = Matrix[ *A ]
mat.column(1).to_a # => ["a2", "b2", "c2"]

谢谢你的回答。但是出于我的好奇心,是否有可能不使用转置方法来实现?是否有任何符号可以选择所有索引? - Muktadir

9

另一种选择是使用Array#map

A = [["a1","a2","a3"],["b1","b2","b3"],["c1","c2","c3"]]
=> [["a1", "a2", "a3"], ["b1", "b2", "b3"], ["c1", "c2", "c3"]]
>> col = 0
=> 0
>> A.map{|a| a[col]}
=> ["a1", "b1", "c1"]

可以根据需要将其组合成一个方法。


有时候最简单的方法是最好的。其他方法(包括我的)会在只需要部分数组时操纵整个数组。 - Cary Swoveland

2
简短回答:
A_t = A.tranpose
A_t[0]

1

我会使用 Array#transpose,但这里有另一种使用 Array#zip 的替代方法:

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

A.first.zip(*A[1..-1]).first #=> [1, 4, 7]

如果相反,

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

如果您不介意更改a,可以这样做:

a.shift.zip(*a).first #=> [1, 4, 7]

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