【问题标题】:How to sum an array of values within a single key of a hash?如何在哈希的单个键中对一组值求和?
【发布时间】:2021-07-04 12:58:19
【问题描述】:

应该很快!在别处找不到确切的查询:

我有一个哈希表:

{"Chicago"=>[35.0, 5.0, 7.0], "Austin"=>[12.0, 42.0, 15.0, 8.0], ... }

我只是想将哈希值(数组)中的数字相加成为:

{"Chicago"=> 47.0, "Austin"=> 77.0, ... }

我尝试过suminjecthash.values.each.inject(0) { |sum, x| sum + x} 等),但遇到了“无法将数组强制转换为整数”异常,我不确定解决此问题的正确方法,尽管它似乎是一个相对简单的问题!

【问题讨论】:

    标签: arrays ruby


    【解决方案1】:

    看看Hash#transform_values。您也可以将inject 替换为Array#sum

    hash.transform_values(&:sum)

    【讨论】:

    • 这就是票。我之前没有使用过transform_values,并且在浏览文档时没有发现它 - 非常感谢!
    【解决方案2】:

    按照您的原始方法,这是一个完整的工作解决方案 - 看起来您是在正确的路线上!

    hash = {"Chicago"=>[35.0, 5.0, 7.0], "Austin"=>[12.0, 42.0, 15.0, 8.0]
    
    hash.map { |city, values| [city, values.inject(0){ |sum, value| sum + value}] }.to_h
    

    呸!但这看起来有点复杂!幸运的是,对于初学者来说,您可以致电 inject with a symbol that names an operator 将其缩短一点:

    hash.map { |city, values| [city, values.inject(:+)] }.to_h
    

    或者更好的是,在这种情况下,您可以调用Array#sum 来实现相同的目的:

    hash.map { |city, values| [city, values.sum] }.to_h
    

    不过,我们仍然可以做得更好。对于这种只需要转换哈希值,同时保留整体哈希结构的非常常见的用例,现代 ruby​​ 有一个内置的方法,称为...你猜对了,transform_values

    hash.transform_values { |values| values.sum }
    

    最后,最后一次简化这个:

    hash.transform_values(&:sum)
    

    【讨论】:

    • 非常有帮助!感谢您花时间浏览它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2011-05-26
    • 2014-04-23
    • 1970-01-01
    • 2022-12-24
    相关资源
    最近更新 更多