[英]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(:+)}
這將適用於任何數量的組件陣列。 reduce
和inject
是同義詞,但在我看來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] }
最后,從數學上講,這是與此相同的問題:
[[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]
或者,如果您確定數組a
和b
的長度將始終相等:
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.