gpt4 book ai didi

ruby - 如何在 Ruby 中对数组进行分组和求和?

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:03 24 4
gpt4 key购买 nike

我有一个这样的数组:

ar = [[5, "2014-01-27"],
[20, "2014-01-28"],
[5, "2014-01-28"],
[10, "2014-01-28"],
[15, "2014-01-29"],
[5, "2014-01-29"],
[5, "2014-01-30"],
[10, "2014-01-30"],
[5, "2014-01-30"]]

我最终需要做的是按日期对数组项进行分组,并对每个子数组的第一项中的数字求和。

所以输出会是这样的:

[[5, "2014-01-27"],
[35, "2014-01-28"],
[20, "2014-01-29"],
[20, "2014-01-30"]]

最佳答案

ar.group_by(&:last).map{ |x, y| [y.inject(0){ |总和,我| sum + i.first }, x] }

编辑添加说明:
我们按产生散列的最后一个值(日期)分组:

{"2014-01-27"=>[[5, "2014-01-27"]], "2014-01-28"=>[[20, "2014-01-28"], [5, "2014-01-28"], [10, "2014-01-28"]], "2014-01-29"=>[[15, "2014-01-29"], [5, "2014-01-29"]], "2014-01-30"=>[[5, "2014-01-30"], [10, "2014-01-30"], [5, "2014-01-30"]]}

然后将其映射为 x 作为散列键,将 y 映射为 [[number, date], [number, date]] 对。

.inject(0) 表示 sum0 开始,然后我们将每个数组的第一项(数字)添加到求和,直到迭代所有数组并添加所有数字。

然后我们执行 [y, x] 其中 x 是哈希键(日期),y 是所有的总和数字。

这种方法很有效,因为我们使用 inject 来避免映射数组两次,并且之后不必反转值,因为我们在映射时交换了它们的位置。

编辑:有趣的是,@bjhaid 和我的答案之间的基准很接近:

    user     system      total        real
5.117000 0.000000 5.117000 ( 5.110292)
5.632000 0.000000 5.632000 ( 5.644323)

1000000 迭代 - 我的方法是最慢的

关于ruby - 如何在 Ruby 中对数组进行分组和求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21506965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com