在Ruby中从一个数组的数组中选择一个列中的所有元素?

33
我有一个数组包含其他的数组:
arr = [["Foo1", "Bar1", "1", "W"], 
["Foo2", "Bar2", "2", "X"], 
["Foo3", "Bar3", "3", "Y"], 
["Foo4", "Bar4", "4", "Z"]]

我希望得到一个只包含每个数组中第三列的数组:

res = ["1", "2", "3", "4"]

我该如何做到这一点?

我想输入像这样的内容:

arr[][2]

但是如果更像 Ruby 的思考方式,我尝试了:

arr.select{ |r| r[2] }

但是这会返回整行数据。


2
你是不是想说 arr.collect{ |r| r[2] } - waldrumpus
你的 select 语句选取了所有第三个元素为真值的行,这就是为什么你没有得到预期结果的原因。 - Michael Kohl
3个回答

56
你想要 arr.map {|row| row[2]}
arr = [["Foo1", "Bar1", "1", "W"], 
["Foo2", "Bar2", "2", "X"], 
["Foo3", "Bar3", "3", "Y"], 
["Foo4", "Bar4", "4", "Z"]]

arr.map {|row| row[2]}
# => ["1", "2", "3", "4"]

9
дҪҝз”ЁRails/ActiveSupportдёӯзҡ„arr.map(&:third)гҖӮиҜҘиҜӯжі•еҸҜд»Ҙж¶ҰиүІе№¶з®ҖеҢ–еҶ…е®№пјҢж„ҸжҖқдёҚеҸҳгҖӮ - Michael Kohl
2
同时,在纯 Ruby 中也可以使用 #first#last - akostadinov

17

另一种方法:

arr.transpose[2]

对于非常大的矩阵,transpose 操作比 map {|r| r[2]} 解决方案更昂贵吗? - Jared Beck
@Jared Beck 就内存而言,我会说是的,更昂贵。 - steenslag
谢谢,我非常喜欢这个,因为它可以在没有块的情况下使用。如果需要获取第一列和第二列(就像我这样),可以使用转置来设置“转置”矩阵,一步到位。 - Ninjaxor
1
@steenslag 为什么会更贵呢? - John Bachir
1
对于一个 n x m 的数组,transpose 方法的中间结果是一个 m x n 的数组;而 map 方法直接得到一个 m x 1 的数组。@JohnBachir - steenslag
@steenslag 你所说的中间结果是什么意思?是在实现过程中吗?稍微退后一步:你和Jared是不是说它更昂贵,因为你们知道Ruby如何实现它,还是因为转置的概念本身就有某些固有的东西? - John Bachir

1

使用 map 或 collect

arr.map { |a| a[2]}


1
map 前面不需要加上 each - Michael Kohl

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