给定一个数组:
arr = [['a', '1'], ['b','2'], ['c', '3']]
最好的方法是将其分成两个数组。
例如,从上面的数组中,我想得到以下两个数组:
first = ['a','b','c']
second = ['1', '2', '3']
我可以使用collect吗?
好的,我刚刚偶然发现了arr.transpose
arr = [['a', '1'], ['b','2'], ['c', '3']].transpose
first = arr[0]
second = arr[1]
与上面的答案相比,arr.zip
、arr.map
和foreach
哪个更有效率?或者哪一个是最优雅的解决方案?
OR
(感谢Jörg W Mittag的评论-请参见下面的评论)
arr.transpose
可以分别赋值给first和second。
first, second = arr.transpose
。这样会更加优雅。而且,既然我们在谈论性能方面:JRuby团队正在开发一种极度优化的编译器,可以在使用解构绑定、多赋值、多返回值、展开参数等时消除中间数组。(事实上,这个编译器非常出色,它的作者已要求他们将JRUBY的某些Java部分重写为Ruby,因为这样做实际上会更快。) - Jörg W Mittagzip
确实是为数学家准备的。https://en.wikipedia.org/wiki/Anamorphism :-) - Vorticozip
方法也非常优雅:arr[0].zip *arr[1..-1]
first = arr[0]
second = arr[1]
arr = [['a', '1'], ['b','2'], ['c', '3']]
a = []
b = []
arr.each{ |i| a << i[0]; b << i[1] }
你可以通过collect(map的别名)来实现这一点,但不能在单个操作中完成,因为map / collect始终返回单个数组。你可以这样做
first = arr.map { |element| element[0] }
second = arr.map { |element| element[1] }
这种方法的缺点是需要两次迭代arr。然而,除非你处理大量元素或者这个操作需要运行很多次,否则通常不会成为问题。
Array.unzip
。不幸的是,目前没有一个.. - mykhal