我有这个数组:
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”中有一些有用的提示,但我无法将它们转移到我的问题中。
答案 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]]