【问题标题】:Select all elements from one column in an array of arrays in Ruby?从Ruby数组中的一列中选择所有元素?
【发布时间】:2014-07-25 12:01:47
【问题描述】:

我有一个数组数组:

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] }

但这会返回整行。

【问题讨论】:

  • 你的意思是arr.collect{ |r| r[2] }
  • 您的select 语句获取了第三个元素为真的所有行,这就是您没有得到预期结果的原因。

标签: ruby


【解决方案1】:

你想要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"]

【讨论】:

  • arr.map(&:third) 使用 Rails/ActiveSupport。
  • #first#last 也可以在纯红宝石中使用
【解决方案2】:

另一种方法:

arr.transpose[2]

【讨论】:

  • 对于非常大的矩阵,transpose 会比map {|r| r[2]} 解决方案更昂贵吗?
  • @Jared Beck Memorywise 我会说是的,更贵。
  • 谢谢,我很喜欢这个,因为你可以不加限制地使用它。如果也需要获取第一列和第二列(就像我一样),可以使用转置来一次性设置“转置”矩阵。
  • @steenslag 为什么会更贵?
  • @JohnBachir 对于 n x m 数组,transpose 有一个 m x n 数组作为中间结果; map 方法直接生成一个 m x 1 数组
【解决方案3】:

使用地图或收集 arr.map { |a|一[2]}

【讨论】:

  • each 之前不需要map
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2012-09-09
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多