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

2024-02-24

我有一个像这样的数组:

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| 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]] pairs.

.inject(0) means sum开始为0,然后我们将每个数组的第一项(数字)添加到该总和中,直到迭代所有数组并将所有数字相加。

然后我们就做[y, x] where x是哈希键(日期),并且y是所有数字的总和。

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ruby 中对数组进行分组和求和? 的相关文章

  • 使用自定义令牌进行 Firebase 身份验证

    我有一个 firebase 项目 我试图从我的 Rails 服务器进行身份验证 按照文档上的说明使用 ruby jwt 库创建自定义令牌 但我不断收到相同的错误 auth invalid custom token 自定义令牌格式不正确 请检
  • 将对象数组转换为 ActiveRecord::Relation

    我有一个对象数组 我们称其为Indicator 我想运行 Indicator 类方法 def self subjects该数组上的种类 范围等 我知道在一组对象上运行类方法的唯一方法是让它们成为 ActiveRecord Relation
  • 将堆分配的指针转换为指向 VLA 的指针是否安全?

    如果我有一个指向代表典型的堆分配空间的指针 行主二维数组 将此指针强制转换为 指向 VLA 的等效指针以方便下标 例子 Assuming m was allocated and initialized something like int
  • 如何在打字稿中将枚举转换为键、值数组?

    var enums 1 HELLO 2 BYE 3 TATA 我希望能够将其转换为如下所示的数组 number 1 word HELLO number 2 word BYE number 3 word TATA 我看到的所有解决方案都形成一
  • 如何在 Rails 应用程序中选择性地跟踪方法及其文件访问?

    对于 Rails 应用程序 我想重载或修改 Kernel load 以便它打印出完整路径 例如puts gt File expand path File dirname FILE File basename FILE 对于加载的每个 Rai
  • 如何让 Numpy 将每一行/张量视为一个值

    许多功能 例如in1d https docs scipy org doc numpy 1 13 0 reference generated numpy in1d html and setdiff1d https docs scipy org
  • 有没有办法在 Nokogiri css 中转义非字母数字字符?

    我有一个锚标签 file html stuff morestuff CHP 1 SECT 2 1 尝试提取 Nokogiri 中引用的内容 documentFragment at css stuff morestuff CHP 1 SECT
  • Ruby IMAP 库:如何显示文件夹中的所有邮件?

    我需要一个脚本来获取所有文件夹中的所有电子邮件 并对其及其附件进行本地备份 here https www ombulabs com blog ruby imap a comprehensive guide to interacting wi
  • Ruby:如何将多个方法调用与“发送”链接在一起

    必须有一种内置的方法来做到这一点 对吧 class Object def send chain arr o self arr each a o o send a return o end end 我刚刚遇到了这个 它确实需要注入 def s
  • 元组/数组列表对

    我本质上是想创建一个配对列表 事实证明这是非常困难的 请注意 在任何人提到哈希表之前 都会有我不关心的重复项 例如 如果我这样做 b dog cat I get Name Value dog cat 这很好 但是 我无法添加类似的内容 b
  • 获取类别和子类别的所有产品(rails、awesome_nested_set)

    正在开发一个电子商务应用程序 我试图解决以下问题 我通过 Awesome nested set 插件实现了我的类别 如果我通过选择一个类别列出我的文章 一切正常 但对于某些链接 我想显示一个类别的所有产品及其子类别的产品 这是仅适用于一种类
  • 如何通过键查找最大和最小日期

    我有一个数组 a array 2010 05 03 gt 100 2010 05 04 gt 400 2008 05 01 gt 800 2011 01 01 gt 800 我如何找到最大值和最小值key date 例如 max gt 20
  • RestSharp反序列化JSON内容(代表一个对象包含字节数组)错误

    Client端收到正式的JSON内容 Id 1 2 3 Size 56 但在反序列化字节数组时出现错误 1 下面的语句出现错误 IRestResponse
  • 如何按键按字母顺序对 Ruby 哈希进行排序

    我正在尝试按键按字母顺序对哈希进行排序 但如果不创建自己的排序类 我似乎无法找到一种方法来做到这一点 我发现下面的代码可以按值排序 如果它是整数 我正在尝试修改它 但没有任何运气 temp ninjas 36 temp pirates 12
  • 使用字符串数组作为子字符串参数的 VBA InStr 函数 (Excel)

    找了很久了 第一次提问 目标 循环遍历包含地址的列 根据单元格包含的邮政编码为单元格偏移 0 6 分配一个值 城市名称 这是我到目前为止所得到的 缩短的数组长度 Sub LabelCell Dim SrchRng As Range cel
  • 将对象字面量转换为排序数组

    我有一个对象文字 其中它的键的值是多个对象 并且内部对象的键之一被命名为 rank 并且具有浮点值 我想将对象文字转换为内部对象的数组 按 rank 的值排序 输入对象 452 bla 123 dff 233 rank 2 234 bla
  • 包含字符串和数字的数组

    在 Objective C 中 很容易创建一个异构数组 如下所示 NSArray myArray String1 String2 123 456 有什么方法可以快速创建这样的数组吗 如果是的话怎么办 Note 我在 swift 中尝试了类似
  • Perl 中令人困惑的文件句柄

    一直在使用以下脚本 但仍然无法理解两种不同 类型 的文件句柄形式背后的含义 任何见解将不胜感激 usr bin perl use warnings use strict open FH example txt or die while
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获

随机推荐