Выдаленне ўсіх элементаў слупка ў двухмернай масіве

У мяне гэты масіў:

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

які прадстаўляюць крэветкі-табліцу, якія змяшчаюць слупкі «A», «B» і «C».

Як выдаліць ўвесь слупок «З» з усімі яго значэннямі, 5, 8, 1?

Можа быць, ёсць карысныя парады ў « Стварэнне двухмерных масіваў і атрымаць доступ да суб-масівы ў Ruby, «і» цяжкасці мадыфікацыі двухмерных матрыцы рубінавай », але я не магу перанесці іх да маёй праблеме.

4

8 адказы

Проста з цікаўнасці дзеля тут ёсць яшчэ адзін падыход (адзін-лайнер):

arr.transpose[0..-2].transpose
7
дададзена
@MarkReed мы маем Масіў # поп , ён будзе рабіць гэтую працу значна, як я адправіў. :)
дададзена аўтар Arup Rakshit, крыніца
ці проста arr.transpose [2] для вяртання слупка.
дададзена аўтар Mark Reed, крыніца
@MarkReed я палічыў за лепшае б выказаць здагадку, arr.transpose.last або arr.transpose [-1] у якасці больш агульнага рашэння.
дададзена аўтар Torimus, крыніца

Так як гэта толькі апошняе значэнне, вы можаце выкарыстоўваць Масіў # поп :

arr.each do |a|
  a.pop
end

Або знайсці індэкс «з» і выдаліць усе элементы, пры гэтым індэкс:

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

Або выкарыстоўваючы Карта :

c_index = arr[0].index "c"
arr.map{|a| a.delete_at c_index }
2
дададзена
 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
1
дададзена
arr.map { |row| row.delete_at(2) } 
#=> ["c", 5, 8, 1]

Гэта калі вы сапраўды хочаце, каб выдаліць апошнюю калонку, так што гэта не ў зыходным масіве больш. Калі вы проста хочаце, каб вярнуць яго, пакінуўшы обр некранутым:

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
1
дададзена
павінен быць , калі індэкс = обр [0] .index ( 'з')
дададзена аўтар Jon Kern, крыніца
# 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) }
1
дададзена
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]]
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]] 
0
дададзена

Мяркуючы, што першы элемент масіва заўсёды з'яўляецца масіў імёнаў слупкоў, то вы можаце зрабіць:

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

Гэта зменіць прыняты ў масіў. Не варта прызначаць яго выхад да чаго-небудзь.

0
дададзена