在Ruby中解开拉链

在Ruby中解开拉链,ruby,Ruby,在Python中,我可以通过返回zip来获得zip的“反向” a = [1,2,3] b = [4,5,6] c = zip(a,b) # [(1,4),(2,5),(3,6)] 如果改为从c开始,我可以使用以下命令返回a和b c = [(1,4),(2,5),(3,6)] a, b = zip(*c) 然而,在Ruby中,似乎只有一个zip方法,因此我不确定我是否可以用完全相同的方法来实现这一点 Ruby中是否有类似的“解压”列表的好习惯用法 我知道你能做到 c[0].zip(*c[1.

在Python中,我可以通过返回zip来获得zip的“反向”

a = [1,2,3]
b = [4,5,6]
c = zip(a,b) # [(1,4),(2,5),(3,6)]
如果改为从
c
开始,我可以使用以下命令返回
a
b

c = [(1,4),(2,5),(3,6)]
a, b = zip(*c)
然而,在Ruby中,似乎只有一个
zip
方法,因此我不确定我是否可以用完全相同的方法来实现这一点

Ruby中是否有类似的“解压”列表的好习惯用法


我知道你能做到

c[0].zip(*c[1..-1])
从本质上来说,语义上是相同的,但这样看起来不那么直观…

您可以使用


使用c.transpose.map(&:compact)以防在解压缩缺少相应索引元素时填充nil。@alokan缺少相应索引元素是什么意思?如果您谈论转置不均匀数组,例如,
[[1,2],[3],[4,5]]。转置
,则会产生
索引器:元素大小不同(1应该是2)
。因此,除非源代码有
nil
元素,否则我认为
transpose
的结果不能包含
nil
?@DaniëlKnippers如果你有,
[1,2,3].zip([4,5])][[1,4],[2,5],[3,nil]
那么
[1,4],[2,5],[3,nil].transpose=[[1,2,3],[4,5]输入不正确
#compact
将从该结果中删除nil。@LeoCorrea我明白了。但是,如果输入实际上是
[4,5,nil]
呢?没有办法知道:)但公平地说,在某些情况下添加
compact
可能会很有用@奥雅纳不,我不用维姆,为什么?
a = [1,2,3]
# => [1,2,3]
b = [4,5,6]
# => [4,5,6]
c = a.zip(b) 
# => [[1,4],[2,5],[3,6]]

d, e = c.transpose
# => [[1,2,3], [4,5,6]]
d
# => [1,2,3]
e
# => [4,5,6]