我有这个数组:
arr = [["a","b","c"],[2,3,5],[3,6,8],[1,3,1]]
它表示一个包含列“a”、“b”和“c”的虾表。
如何删除整个“c”列及其所有值 5、8、1?
也许在“在 Ruby 中创建二维数组和访问子数组”和“难以修改二维 ruby 数组”中有有用的提示,但我无法将它们转移到我的问题上。
我有这个数组:
arr = [["a","b","c"],[2,3,5],[3,6,8],[1,3,1]]
它表示一个包含列“a”、“b”和“c”的虾表。
如何删除整个“c”列及其所有值 5、8、1?
也许在“在 Ruby 中创建二维数组和访问子数组”和“难以修改二维 ruby 数组”中有有用的提示,但我无法将它们转移到我的问题上。
出于好奇,这里是另一种方法(单线):
arr.transpose[0..-2].transpose
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
因为它只是您可以使用的最后一个值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 }
# 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) }
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
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]]
假设数组的第一个元素始终是列名数组,那么您可以这样做:
def delete_column(col, array)
index = array.first.index(col)
return unless index
array.each{ |a| a.delete_at(index) }
end
它将修改传入的数组。你不应该将它的输出分配给任何东西。
我有一个更通用的需要删除一个或多个与文本模式匹配的 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]]