新手问题 数组对应项相加

chyanog · 2012年08月16日 · 最后由 xuluan 回复于 2012年08月19日 · 6362 次阅读

a1=[1,2,3] a2=[4,5,6] a3=[7,8,9] 如何得到 result=[12,15,18] 尽量用 map 之类的写法,不用循环

a1.zip(a2,a3).reduce([]) { |result, item| result << item.sum }

[a1,a2,a3].transpose.map{ |a| a.sum }

你确定要这么写么,我担心最后只有你自己能看懂

改进版,这样每个数组长度不相同也可以

a1 = [1, 2, 3]
a2 = [4, 5, 6]
a3 = [7, 8]

a1.zip(a2, a3).reduce([]) { |result, item| result << item.compact.sum }

p (0..2).map { |i| a1[i]+a2[i]+a3[i]}

p (0..2).map { |i| [a1,a2,a3].map { |j| j[i]}.inject(:+) }

python 中可以这样的 map(lambda *x:sum(x),a1,a2,a3)

#1 楼 @HungYuHei #2 楼 @ywencn 你们都是在 Rails console 下写 Ruby 程序吗?:)

a1.zip(a2,a3).map{|arr| arr.reduce &:+} 其实 map 这些不还是循环..这么纠结干嘛

#6 楼 @ashchan 我也没有注意到 sum 原来是 Rails 的方法,将 sum 改为 inject(:+) 可以了

匿名 #9 2012年08月17日

来晚了。没参考别人答案之前写的答案:a1.zip(a2,a3).reduce([]){ |result, a| result << a.reduce(0){ |sum, i | sum + i } }

a1.zip(a2,a3).reduce([]){ |result, a| result << a} 和 a1.zip(a2,a3) 不是一样的吗

单行方案: [a1, a2, a3].transpose.map{ |x| x.reduce(&:+) }

还是 Rails 的 sum 方法更优美、自然:

module Enumerable
  def sum(identity = 0, &block)
    if block_given?
      map(&block).sum(identity)
    else
      inject { |sum, element| sum + element } || identity
    end
  end
end

[a1,a2,a3].transpose.map(&:sum)

其实 Python 的也不错: map(sum, zip(a1, a2, a3))

方法都让大家想完了..

来个 loop 版本的吧。

x = a1.zip(a2, a3).to_enum
y = []
loop { y << x.next.reduce(:+)  }

#11 楼 @suninny

其实 reduce(:+) 就可以搞定的事情,何必再搞个 sum 出来?而且还没有 reduce 灵活。

我想这也是 Ruby 一直没有增加 sum 方法的原因吧。

a1.zip(a2, a3).transpose.map{ |x| x.reduce { |sum, y| sum += y || 0 } }

[a1,a2,a3].transpose.map {|a| a.inject(:+)}

a1.zip(a2, a3).map{|a| a.inject(:+)}

需要 登录 后方可回复, 如果你还没有账号请 注册新账号