ruby - 如何使用可枚举函数在二维数组中添加每组总和?

标签 ruby reduce enumerable

我有一个二维数组如下:

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/

相关文章:

ruby - 如何重新创建任何? Ruby 中的方法

ruby - 我如何在 ruby​​ 中解析这个 JSON

ruby - 如何在 Ruby 中初始化哈希的大小?

swift - 从 Reduce 获取任意类型

c# - 可枚举给出意外输出

Ruby Lazy Enumerable flat_map 不是很懒

json - 当我尝试 sudo gem install json 我收到以下错误

mysql - 我应该使用 SQL 还是 Ruby 处理大量数据?

ruby - 求和 ruby​​ 哈希值

python - 如何重写这个 python 函数以接受列表作为参数?