我有两个(或更多)数组,每个数组有12个整数(对应于每个月的值).我想要的就是将它们加在一起,这样我就可以得到一个单独的数组,每个月都有总和值.这是一个有三个值的例子:[1,2,3]和[4,5,6] => [5,7,9]
我能想到的最好的是:
[[1,2,3],[4,5,6]].transpose.map{|arr| arr.inject{|sum, element| sum+element}} #=> [5,7,9]
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?这似乎是一件非常基本的事情.
gle*_*ald 50
这是transposeAnurag建议的版本:
[[1,2,3], [4,5,6]].transpose.map {|x| x.reduce(:+)}
Run Code Online (Sandbox Code Playgroud)
这适用于任意数量的组件阵列.reduce并且inject是同义词,但reduce在我看来更清楚地传达代码的意图......
为了更清晰的语法(不是最快),您可以使用Vector:
require 'matrix'
Vector[1,2,3] + Vector[4,5,6]
=> Vector[5, 7, 9]
Run Code Online (Sandbox Code Playgroud)
对于多个向量,您可以:
arr = [ Vector[1,2,3], Vector[4,5,6], Vector[7,8,9] ]
arr.inject(&:+)
=> Vector[12, 15, 18]
Run Code Online (Sandbox Code Playgroud)
如果您希望将数组加载到Vectors并求和:
arrays = [ [1,2,3], [4,5,6], [7,8,9] ]
arrays.map { |a| Vector[*a] }.inject(:+)
=> Vector[12, 15, 18]
Run Code Online (Sandbox Code Playgroud)
这是我尝试代码打高尔夫球的事情:
// ruby 1.9 syntax, too bad they didn't add a sum() function afaik
[1,2,3].zip([4,5,6]).map {|a| a.inject(:+)} # [5,7,9]
Run Code Online (Sandbox Code Playgroud)
zip返回[1,4],[2,5],[3,6],和地图总和每个子阵列.
小智 6
我谦卑地觉得我看到的其他答案非常复杂,以至于他们会让代码审稿人感到困惑.您需要添加一个解释性注释,这只会增加所需的文本量.
怎么回事:
a_arr = [1,2,3]
b_arr = [4,5,6]
(0..2).map{ |i| a_arr[i] + b_arr[i] }
Run Code Online (Sandbox Code Playgroud)
稍微不同的解决方案:(这样你就不会硬编码"2")
a_arr = [1,2,3]
b_arr = [4,5,6]
c_arr = []
a_arr.each_index { |i| c_arr[i] = a_arr[i] + b_arr[i] }
Run Code Online (Sandbox Code Playgroud)
最后,从数学上讲,这是同一个问题:
小智 6
现在我们可以在2.4中使用sum
nums = [[1, 2, 3], [4, 5, 6]]
nums.transpose.map(&:sum) #=> [5, 7, 9]
Run Code Online (Sandbox Code Playgroud)
小智 5
[[1,2,3],[4,5,6]].transpose.map{|a| a.sum} #=> [5,7,9]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22878 次 |
| 最近记录: |