我有一个二维数组,如下所示:

ary = [["a", 10],["a", 20],["b", 9],["b",7],["c",12]]

我想用同一个键对数值求和,生成如下哈希:
desired_result = {"a"=>30, "b"=>16, "c"=>12}

我可以使用具有默认值(0)和循环的哈希,如下所示:
rslt = Hash.new(0)
ary.each do |line|
  rslt[line[0]] += line[1]
end

但我想避免循环并使用枚举函数。我想出了以下(相当难看的)表达:
rslt = ary.group_by {|a| a[0]}.map {|k,v| [k, v.map {|v| v[1]}.reduce(:+)]}.to_h

这比循环版本更难阅读。
有没有一种方法可以在没有循环的情况下更优雅地完成这个任务?

最佳答案

Enumerable#group_by之后,我建议连锁Hash#transform_values

ary.group_by(&:first).transform_values { |v| v.sum(&:last) }
#=> {"a"=>30, "b"=>16, "c"=>12}

关于ruby - 如何使用可枚举函数在二维数组中每组加和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55316776/

10-13 02:10