2013-09-01 3 views
1

Я пытаюсь использовать Enumerable#zip для массива массивов, чтобы сгруппировать элементы первого вложенного массива с соответствующими элементами каждого последующего вложенного массива. Это мой массив:Использование Enumerable # zip в массиве массивов

roster = [["Number", "Name", "Position", "Points per Game"], 
      ["12","Joe Schmo","Center",[14, 32, 7, 0, 23] ], 
      ["9", "Ms. Buckets ", "Point Guard", [19, 0, 11, 22, 0] ], 
      ["31", "Harvey Kay", "Shooting Guard", [0, 30, 16, 0, 25] ], 
      ["7", "Sally Talls", "Power Forward", [18, 29, 26, 31, 19] ], 
      ["22", "MK DiBoux", "Small Forward", [11, 0, 23, 17, 0] ]] 

Я хочу группы «Номер» с «12», «9», «31», «7» и «22», а затем сделать то же самое для «Название» , «Позиция» и т. Д., Используя zip. Ниже дает мне выход, я хочу:

roster[0].zip(roster[1], roster[2], roster[3], roster[4], roster[5]) 

Как переформатировать это так, что если я добавил игроков в моем списке, то они будут автоматически включены в zip без меня, чтобы вручную ввести в roster[6], roster[7], и т. д. Я пробовал использовать диапазоны несколькими способами, но пока ничего не работает.

ответ

9

Сначала извлечь голову и хвост списка (заголовок и строки, соответственно), используя восклицательный знак, а затем zip их вместе:

header, *rows = roster 
header.zip(*rows) 

Это то же самое, как с помощью transpose на оригинальном roster:

header, *rows = roster 
zipped = header.zip(*rows) 

roster.transpose == zipped #=> true 
+2

Вы правы. 'roster.transpose' - это все, что было необходимо. – sawa

+0

Спасибо - оба ваших предложения работали. Я согласен, транспонировать был подходящий метод, который я просто не знал о его существовании. –

+1

@DougMill Если это ответили на ваш вопрос, не забудьте [упредить/принять его] (http://meta.stackexchange.com/a/5235/158402) ':)' –

0
roster[0].zip(*(roster[1..-1])) 

не имеет значения, сколько в массиве реестра.

+0

Я предполагаю, что это было проголосовано тем же человеком, который проголосовал за совершенно элегантный ответ ниже. OP уже понимает метод 'zip'. Они просто сказали, что они пробовали всевозможные диапазоны и не могли заставить его работать. Здесь есть и другие хорошие ответы, я просто показывал, как диапазон CAN работает независимо от количества игроков, которые они добавляют позже. – Beartech

0
p roster.transpose() 

.......................

+0

Это недостаток деталей. Пожалуйста, дополните. –

+1

После имени переменной «список» введите точку, затем «t», затем «r», затем «a», затем «n», затем «s», затем «p», затем 'o', затем 's', затем 'e'. Для вывода переменных вы можете использовать puts или p, что означает «проверка». Если вы выведете массив с puts, он будет печатать каждый элемент массива в новой строке, что затрудняет определение того, что происходит. Если вы выведете массив с p, он покажет вам элементы массива, разделенные запятыми и скобками вокруг массива. – 7stud

+0

Ruby - это язык, изобретенный японским ученым-вычислителем Юкихиро Мацумото, который родился 14 апреля 1965 года, а рубин недавно увидел версию версии 2.x. transpose() - метод ruby, и это метод класса Array. puts и p - частные методы модуля Kernel, но поскольку класс Object включает модуль Kernel, puts и p можно вызывать в любом месте. – 7stud

2
:zip.to_proc[*roster] 

немного более гибким, чем transpose:

:zip.to_proc[*[(0..2), [:a, :b, :c]]] #=> [[0, :a], [1, :b], [2, :c]]

+0

Приятный, он также поддерживает списки различного размера. ': Застежка-молния.to_proc [* [[1,2], [4,5,6]]] '->' [[1, 4], [2, 5]] ', тогда как транспонирование дает ошибку:' IndexError: размер элемента отличается (3 должно быть 2) ' – mahemoff

 Смежные вопросы

  • Нет связанных вопросов^_^