gpt4 book ai didi

ruby - 对两个散列进行分组/汇总的最有效方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:08 25 4
gpt4 key购买 nike

我有两个散列,其中包含一些我需要聚合的数据。第一个是哪些 id (id_1, id_2, id_3, id_4) 属于哪个类别 (a, b, c) 的映射:

hash_1 = {'a' => ['id_1','id_2'], 'b' => ['id_3'], 'c' => ['id_4']}

第二个哈希包含给定日期(date_1、date_2、date_3)每个 id 发生了多少事件的值:

hash_2 = {
'id_1' => {'date_1' => 5, 'date_2' => 6, 'date_3' => 8},
'id_2' => {'date_1' => 0, 'date_3' => 6},
'id_3' => {'date_1' => 0, 'date_2' => nil, 'date_3' => 1},
'id_4' => {'date_1' => 10, 'date_2' => 1}
}

我想要的是获取每个类别 (a,b,c) 的总事件。对于上面的例子,结果看起来像这样:

hash_3 = {'a' => (5+6+8+0+6), 'b' => (0+0+1), 'c' => (10+1)}

我的问题是,大约有 5000 个类别,每个类别通常指向 1 到 3 个 ID,并且每个 ID 都有 30 个或更多日期的事件计数。所以这需要相当多的计算。在 Ruby 中进行这种分组的最高效(最省时)的方法是什么?

更新到目前为止,这是我尝试过的(大约需要 6-8 秒!,非常慢):

def total_clicks_per_category
{}.tap do |res|
hash_1.each do |cat, ids|
res[cat] = total_event_per_ids(ids)
end
end
end

def total_event_per_ids(ids)
ids.reduce(0) do |memo, id|
events = hash_2.fetch(id, {})
memo + (events.values.reduce(:+) || 0)
end
end

附言我正在使用 Ruby 2.3。

最佳答案

我正在手机上写这篇文章,所以我现在无法测试,但看起来还不错。

g = hash_2.each_with_object({}) { |(k,v),g| g[k] = v.values.compact.sum }
hash_3 = hash_1.each_with_object({}) { |(k,v),h| h[k] = g.values_at(*v).sum }

关于ruby - 对两个散列进行分组/汇总的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42852644/

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