删除二维数组中列的所有元素

时间:2013-05-21 19:29:37

标签: ruby arrays multidimensional-array

我有这个数组:

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

表示包含“a”,“b”和“c”列的prawn表。

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

也许“Create two-dimensional arrays and access sub-arrays in Ruby”和“difficulty modifying two dimensional ruby array”中有一些有用的提示,但我无法将它们转移到我的问题中。

8 个答案:

答案 0 :(得分:8)

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

arr.transpose[0..-2].transpose

答案 1 :(得分: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 }

答案 2 :(得分:1)

 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

答案 3 :(得分: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

答案 4 :(得分: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) }

答案 5 :(得分:0)

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

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

它将修改传入的数组。您不应将其输出分配给任何内容。

答案 6 :(得分: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]]

答案 7 :(得分:0)

我更需要删除与文本模式匹配的一个或多个列 s (不只是删除最后一列)。

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