我有一个二维数组如下:
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
这比循环版本更难阅读。
有没有一种不用循环更优雅地做到这一点的方法?
最佳答案
您可以使用 each_with_object
(或 inject
)并传入一个散列,其中新键被初始化为零值:
ary.each_with_object(Hash.new(0)){ |(k, v), count| count[k] += v }
# => {"a"=>30, "b"=>16, "c"=>12}
关于ruby - 如何使用可枚举函数在二维数组中添加每组总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55316776/