繁体   English   中英

红宝石:求和两个或多个数组的对应成员

[英]ruby: sum corresponding members of two or more arrays

我有两个(或更多)数组,每个数组中有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]

有更好的方法吗? 似乎想做的一件基本的事情。

这是Anurag建议的transpose版本:

[[1,2,3], [4,5,6]].transpose.map {|x| x.reduce(:+)}

这将适用于任何数量的组件阵列。 reduceinject是同义词,但在我看来reduce可以在此处更清楚地传达代码的意图...

为了获得更清晰的语法(不是最快的语法),可以使用Vector

require 'matrix'
Vector[1,2,3] + Vector[4,5,6]
=> Vector[5, 7, 9]

对于多个向量,您可以执行以下操作:

arr = [ Vector[1,2,3], Vector[4,5,6], Vector[7,8,9] ]
arr.inject(&:+)
=> Vector[12, 15, 18]

如果您希望将数组加载到Vector中并求和:

arrays = [ [1,2,3], [4,5,6], [7,8,9] ]
arrays.map { |a| Vector[*a] }.inject(:+)
=> Vector[12, 15, 18]

这是我尝试对此事物进行代码搜索的尝试:

// 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]

zip返回[1,4][2,5][3,6] ,并且map对每个子数组求和。

我谦卑地感到,我看到的其他答案是如此复杂,以至于会使代码审查者感到困惑。 您将需要添加一个解释性注释,这只会增加所需的文本量。

怎么样呢:

a_arr = [1,2,3]
b_arr = [4,5,6]
(0..2).map{ |i| a_arr[i] + b_arr[i] }

略有不同的解决方案:(这样您就不必对“ 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] }

最后,从数学上讲,这是与此相同的问题:

如何在Ruby中执行向量加法?

[[1,2,3],[4,5,6]].transpose.map{|a| a.sum} #=> [5,7,9]

现在我们可以在2.4中使用sum

nums = [[1, 2, 3], [4, 5, 6]]
nums.transpose.map(&:sum) #=> [5, 7, 9]

@FriendFX,您对@ user2061694的回答是正确的。 它只对我在Rails环境中有效。 如果进行以下更改,则可以使其在纯Ruby中运行...

在IRB

[[0, 0, 0], [2, 2, 1], [1,3,4]].transpose.map {|a| a.inject(:+)}
 => [3, 5, 5]


[[1,2,3],[4,5,6]].transpose.map {|a| a.inject(:+)}
 => [5, 7, 9]

对于:

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

您可以zip然后使用reduce

p a.zip(b).map{|v| v.reduce(:+) }
#=> [5, 7, 9]

或者,如果您确定数组ab的长度将始终相等:

p a.map.with_index { |v, i| v + b[i] }
#=> [5, 7, 9]

这可能不是最佳答案,但它可以工作。

array_one = [1,2,3]
array_two = [4,5,6]
x = 0
array_three = []
while x < array_one.length
  array_three[x] = array_one[x] + array_two[x]
  x += 1
end

=>[5,7,9]

与其他答案相比,这可能是更多的代码行,但这仍然是一个答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM