5

我有这个数组:

arr = [["a","b","c"],[2,3,5],[3,6,8],[1,3,1]]

它表示一个包含列“a”、“b”和“c”的虾表。

如何删除整个“c”列及其所有值 5、8、1?

也许在“在 Ruby 中创建二维数组和访问子数组”和“难以修改二维 ruby​​ 数组”中有有用的提示,但我无法将它们转移到我的问题上。

4

8 回答 8

10

出于好奇,这里是另一种方法(单线):

arr.transpose[0..-2].transpose
于 2013-05-21T19:54:43.027 回答
3
 arr = [["a","b","c"],[2,3,5],[3,6,8],[1,3,1]]

 i = 2   # the index of the column you want to delete
 arr.each do |row|
   row.delete_at i
 end

  => [["a", "b"], [2, 3], [3, 6], [1, 3]] 

 class Matrix < Array
   def delete_column(i)
     arr.each do |row|
      row.delete_at i
     end
   end
 end
于 2013-05-21T19:33:39.193 回答
2

因为它只是您可以使用的最后一个值Array#pop

arr.each do |a|
  a.pop
end

或者找到索引"c"并删除该索引处的所有元素:

c_index = arr[0].index "c"
arr.each do |a|
  a.delete_at c_index
end

或使用map

c_index = arr[0].index "c"
arr.map{|a| a.delete_at c_index }
于 2013-05-21T19:33:46.350 回答
1
# Assuming first row are headers
arr = [["a","b","c"],[2,3,5],[3,6,8],[1,3,1]]

col = arr.first.index "c"
arr.each { |a| a.delete_at(col) }
于 2013-05-21T19:58:19.043 回答
1
arr.map { |row| row.delete_at(2) } 
#=> ["c", 5, 8, 1]

那是如果您真的想删除最后一列,那么它就不再在原始数组中了。如果您只想在arr原封不动的情况下退回它:

arr.map { |row| row[2] }
#=> ["c", 5, 8, 1]

如果要删除与特定标题对应的列中的所有元素:

if index = arr.index('c') then
   arr.map { |row| row[index] }  # or arr.map { |row| row.delete_at(index) }
end
于 2013-05-21T19:34:17.867 回答
0
arr = [["a","b","c"],[2,3,5],[3,6,8],[1,3,1]]
arr.map(&:pop)
p arr #=> [["a", "b"], [2, 3], [3, 6], [1, 3]]
于 2013-05-22T04:58:49.380 回答
0

假设数组的第一个元素始终是列名数组,那么您可以这样做:

def delete_column(col, array)
  index = array.first.index(col)
  return unless index
  array.each{ |a| a.delete_at(index) }
end

它将修改传入的数组。你不应该将它的输出分配给任何东西。

于 2013-05-21T19:37:12.643 回答
0

我有一个更通用的需要删除一个或多个与文本模式匹配的 column 而不仅仅是删除最后一列)。

 col_to_delete = 'b'
 arr = [["a","b","c"],[2,3,5],[3,6,8],[1,3,1]]
 arr.transpose.collect{|a| a if (a[0] != col_to_delete)}.reject(&:nil?).transpose
 => [["a", "c"], [2, 5], [3, 8], [1, 1]] 
于 2016-08-26T21:23:51.823 回答