Нарезка массива массивов - PullRequest
       17

Нарезка массива массивов

2 голосов
/ 01 февраля 2012

Пример массива,

# sub-arrays are all of the same length
arr = [[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]]

Теперь

arr.some_slicing_technique(0..2)

должен дать мне,

[[1,2,3], [5,6,7], [2,4,6], [1,3,5]]

some_slicing_technique существует? Как лучше всего это решить?

Ответы [ 3 ]

8 голосов
/ 01 февраля 2012

Вы можете сделать это так:

[[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]].map {|e| e.take(3)}

=> [[1, 2, 3], [5, 6, 7], [2, 4, 6], [1, 3, 5]]

Или, если вы хотите использовать диапазоны:

[[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]].map {|e| e[0..2]}
5 голосов
/ 01 февраля 2012

Вы можете транспонировать исходный массив, удалить последний блок и снова транспонировать его:

arr.transpose[0..2].transpose
1 голос
/ 01 февраля 2012

Немного более обобщенно:

arr = [[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]]
slice_lambda = lambda { |r| lambda{ |x| x[r]} }
arr.map(&slice_lambda[0..2])
# => [[1, 2, 3], [5, 6, 7], [2, 4, 6], [1, 3, 5]]
arr.map(&slice_lambda[1..2])
# => [[2, 3], [6, 7], [4, 6], [3, 5]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...