Ruby 在数组上使用可枚举#zip

Ruby 在数组上使用可枚举#zip,ruby,arrays,enumerable,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] ]

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

如何重新设置格式,以便如果我将球员添加到我的花名册中,他们将自动包含在
邮政编码中,而无需我手动键入
花名册[6]
花名册[7]
,等等。我尝试了多种方法使用范围,但似乎没有任何效果。

首先使用splat提取列表的开头和结尾(分别是标题和行),然后将它们一起提取:

header, *rows = roster
header.zip(*rows)
这与在原始
花名册上使用相同:

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

roster.transpose == zipped  #=> true

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

header, *rows = roster
header.zip(*rows)
这与在原始
花名册上使用相同:

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

roster.transpose == zipped  #=> true
不管花名册中有多少人

p roster.transpose()
不管花名册中有多少人

p roster.transpose()

:zip.to_proc[*roster]

:zip.to_proc[*roster]
比转置
灵活一点:

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

比转置
灵活一点:


:zip.to.[u proc[*[(0..2),[:a,:b,:c]].[[0,:a],[1,:b],[2,:c].

谢谢-你的建议都很有效。我同意,转置是合适的方法,我只是不知道它的存在。@DougMill如果这回答了你的问题,别忘了
:)
我喜欢这个解决方案。谢谢。谢谢-你的两个建议都奏效了。我同意,转置是合适的方法,我只是不知道它的存在。@DougMill如果这回答了你的问题,别忘了
:)
我喜欢这个解决方案。谢谢,这缺乏细节。请详细说明。在变量名“花名册”后,键入点,然后键入“t”,然后键入“r”,然后键入“a”,然后键入“n”,然后键入“s”,然后键入“p”,然后键入“o”,然后键入“s”,最后键入“e”。要输出变量,可以使用puts或p,它代表“inspect”。如果您输出一个带有puts的数组,它将在换行符上打印数组的每个元素,这使您很难了解发生了什么。如果你输出一个带有p的数组,它会显示数组中的元素,这些元素之间用逗号分隔,数组周围用括号括起来。Ruby是一种由日本计算机科学家松本幸弘发明的语言,他出生于1965年4月14日,Ruby最近发布了2.x版。transpose()是一个ruby方法,它是Array类的一个方法。puts和p是内核模块的私有方法,但是由于对象类包括内核模块,所以puts和p可以在任何地方调用。这缺乏细节。请详细说明。在变量名“花名册”后,键入点,然后键入“t”,然后键入“r”,然后键入“a”,然后键入“n”,然后键入“s”,然后键入“p”,然后键入“o”,然后键入“s”,最后键入“e”。要输出变量,可以使用puts或p,它代表“inspect”。如果您输出一个带有puts的数组,它将在换行符上打印数组的每个元素,这使您很难了解发生了什么。如果你输出一个带有p的数组,它会显示数组中的元素,这些元素之间用逗号分隔,数组周围用括号括起来。Ruby是一种由日本计算机科学家松本幸弘发明的语言,他出生于1965年4月14日,Ruby最近发布了2.x版。transpose()是一个ruby方法,它是Array类的一个方法。puts和p是内核模块的私有方法,但是由于对象类包括内核模块,所以puts和p可以在任何地方调用。我想这是被否决了下面完美答案的人否决的。OP已经理解了
zip
方法。他们只是说他们尝试了各种各样的射程,但都没能成功。这里已经有其他很好的答案了,我只是展示了一个范围是如何工作的,不管他们后来增加了多少玩家。我想这是被投了反对票的人否决的,他否决了下面完美的答案。OP已经理解了
zip
方法。他们只是说他们尝试了各种各样的射程,但都没能成功。这里已经有其他很好的答案了,我只是展示了一个范围是如何工作的,不管他们后来添加了多少玩家。很好,它还支持不同大小的列表<代码>:zip.to_proc[*[[1,2],[4,5,6]]
->
[[1,4],[2,5]]
而转置给出了一个错误:
索引器:元素大小不同(3应该是2)
很好,它还支持不同大小的列表<代码>:zip.to_proc[*[[1,2],[4,5,6]]->
[[1,4],[2,5]]
而转置给出错误:
索引器:元素大小不同(3应该是2)