2013-07-05 62 views
4

我有三个Ruby的数组:平均几个红宝石阵列

[1, 2, 3, 4] 
[2, 3, 4, 5] 
[3, 4, 5, 6] 

我怎么能采取所有三个数字的平均值0位置,再位置1等,并将其存储在一个名为“新阵平均'?

回答

7
a = [1, 2, 3, 4] 
b = [2, 3, 4, 5] 
c = [3, 4, 5, 6] 

a.zip(b,c) 
    # [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]] 
.map {|array| array.reduce(:+)/array.size } 
    # => [ 2,3,4,5] 
+4

这是很好的。如果数组的大小不同,请小心使用zip,因为它将对结果应用nil,在这种情况下会抛出异常 – NicoSantangelo

+1

有两点值得一提。首先,你'[a,b,c] .transpose'是'a.zip(b,c)'的不错选择。其次,你只是在这个例子中处理整数,如果除法没有余数,分割就不能工作。我会去'[a,b,c] .transpose.map {| ary | ary.inject(:+)/ ary.size}'。 –

0

试试这个:

arr = ([1, 2, 3, 4] + [3, 4, 5, 6] + [2, 3, 4, 5]) 
arr.inject(0.0) { |sum, el| sum + el }/arr.size 

级联可以通过多种方式来实现,取决于你如何存储阵列。

作为一个语法糖,你可以像这样做太:

arr.inject(:+).to_f/arr.size