在数组数组上使用Enumerable#zip

时间:2013-09-01 23:12:35

标签: ruby arrays enumerable

我试图在数组数组上使用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] ]]

我想分组" Number"使用" 12"," 9"," 31"," 7"," 22",然后执行对于"名称","位置"等使用zip相同。以下给出了我想要的输出:

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

如何重新格式化,以便如果我将玩家添加到我的名单中,它们将自动包含在zip中,而无需我手动输入roster[6]roster[7]等我曾尝试过多种方式使用范围,但似乎没有任何效果。

4 个答案:

答案 0 :(得分:11)

首先使用splat提取列表的头部和尾部(分别为标题和行),然后zip将它们组合在一起:

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

这与在原始roster上使用transpose相同:

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

roster.transpose == zipped  #=> true

答案 1 :(得分:2)

:zip.to_proc[*roster]

transpose更灵活:

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

答案 2 :(得分:0)

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

名册数组中的数量无关紧要。

答案 3 :(得分:0)

p roster.transpose()

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