Как разбить массив? - PullRequest
5 голосов
/ 05 июля 2010

Учитывая массив:

arr = [['a', '1'], ['b','2'], ['c', '3']] 

Какой лучший способ разбить его на два массива?

Например, из приведенного выше массива я хочу получить следующие два массива:

first = ['a','b','c']  
second = ['1', '2', '3'] 

Могу ли я сделать это, используя collect?

Ответы [ 4 ]

15 голосов
/ 05 июля 2010

хорошо, я только что наткнулся на arr.transpose

arr = [['a', '1'], ['b','2'], ['c', '3']].transpose 

first = arr[0] 

second = arr[1] 

по сравнению с ответами выше arr.zip, arr.map и foreach, что более эффективно?Или какое самое элегантное решение?

ИЛИ (благодаря комментарию Jörg W Mittag - см. Комментарий ниже) сначала, во-вторых = arr.transpose

4 голосов
/ 05 июля 2010

Использование метода zip также довольно элегантно:

arr[0].zip *arr[1..-1]
first = arr[0]
second = arr[1]
1 голос
/ 05 июля 2010
arr = [['a', '1'], ['b','2'], ['c', '3']]

a = []
b = []

arr.each{ |i| a << i[0]; b << i[1] }
0 голосов
/ 05 июля 2010

Вы можете сделать это через collect (псевдоним карты), но не в одной операции, потому что map / collect всегда возвращает один массив.Вы можете сделать

first = arr.map { |element| element[0] }   
second = arr.map { |element| element[1] }

, что имеет недостаток, заключающийся в повторении arr дважды.Однако это обычно не должно быть проблемой, если только вы не имеете дело с большим количеством элементов или эта операция должна выполняться много раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...