我试图在数组数组上使用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]
等我曾尝试过多种方式使用范围,但似乎没有任何效果。
答案 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()
.......................