我有两个不均匀的数组:
a = [1,2,3,4,5,6,7,8,9,10]
b = ['d','e','f','g','h','i','j']
我想绑定它们,以便返回的对象如下所示:
result = [[nil, 1], [nil, 2], [nil, 3], ["d", 4], ["e", 5], ["f", 6], ["g", 7],
["h", 8], ["i", 9], ["j", 10]]
zip
方法不起作用,因为它通过将元素排列到前面来做相反的事情。到目前为止,我有:
def bind(a,b,ac=a.count,bc=b.count)
distance = ac - bc < 0 ? bc - ac : ac - bc
min = ac > bc ? b : a
max = ac > bc ? a : b
distance.times { min.unshift(nil) }
return min.zip(max)
end
ruby有没有办法解决这个问题(或者更快捷的方法)?
答案 0 :(得分:3)
假设a.size >= b.size
:
([nil]*(a.size-b.size)).concat(b).zip(a)
#=> [[nil, 1], [nil, 2], [nil, 3], ["d", 4], ["e", 5],
# ["f", 6], ["g", 7], ["h", 8], ["i", 9], ["j", 10]]
或
[([nil]*(a.size-b.size)).concat(b), a].transpose
当两个数组的大小相同时,方法Enumerable#zip和Array#transpose为 yin and yang 。
答案 1 :(得分:2)
这个怎么样?
a.reverse.zip(b.reverse).reverse.map(&:reverse)
答案 2 :(得分:0)
虽然非常接近Cary的解决方案。我发现这更具可读性。
missing_elements = Array.new(a.size-b.size)
p (missing_elements+b).zip(a)