簡體   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