【问题标题】:To sum up same keys values in Ruby总结 Ruby 中相同的键值
【发布时间】:2017-05-17 04:35:14
【问题描述】:

我有下面的数组,它必须总结与 {'dogs' => 11, 'cats' => 3} 相同的键值。

animals = [['dogs', 4], ['cats', 3], ['dogs', 7]]

我在stackoverflow上搜索时找到了以下答案(我丢失了链接:()

print animals.each_with_object(Hash.new(0)) { |(k, v), h| h[k] += v }

但是我无法清楚地知道 k、v 和 h 究竟代表什么。因为“h”是块代码的第二个参数,但它与 h[k] 连续。谁能把代码解释清楚?

非常感谢。

【问题讨论】:

    标签: arrays ruby hash key


    【解决方案1】:

    简单来说:

    animals.each_with_object(Hash.new(0)) do |(key, value), hash|
      hash[key] += value
    end
    

    这里(k,v)animals 散列中每一对的扩展,即键值h 表示与此迭代一起传递的“对象”。

    就 Ruby 代码而言,这是一种相当标准的模式。

    【讨论】:

    • 感谢您的及时回复。我想添加上面的代码只是为了在 cmd 打印结果(我的意思是“do”,“end”语法)?
    • 在 Ruby 中有 puts 用于显示字符串。如果将此结果分配给变量,则可以执行 puts result.inspect 其中 result 是您分配的内容。调试友好的p 方法更简单,p result 等效于其他版本。
    【解决方案2】:
    animals.map(&:dup).
            group_by(&:shift).
            map { |k, v| [k, v.flatten.inject(:+)] }.
            to_h
    #⇒ {"dogs"=>11, "cats"=>3} 
    

    【讨论】:

    • 这就是我想做的事情,但如果完全表达出来,它确实看起来很像炼金术。它还产生了比each_with_object 更多的垃圾。
    • @tadman 确实如此,但我一开始的想法已经在你的回答中提供了,所以我准备好了一些不同的东西。我肯定会投票给你的答案。
    • Enumerable#sum 也不是专门的rails 方法吗?因为这里没有rails 标签,所以reduce(:+) 可能更合适。
    【解决方案3】:

    玩弄数组以更好地理解它

    animals.each {|arr| puts arr.inspect }
    # ["dogs", 4]
    # ["cats", 3]
    # ["dogs", 7]
    
    animals.each {|k, v| puts "k -> #{k}, v -> #{v}" }
    # k -> dogs, v -> 4
    # k -> cats, v -> 3
    # k -> dogs, v -> 7
    
    animals.each_with_object({}) do |(k, v), h| 
      puts "k -> #{k}, v -> #{v}, h -> #{ h.inspect }"
    end
    # k -> dogs, v -> 4, h -> {}
    # k -> cats, v -> 3, h -> {}
    # k -> dogs, v -> 7, h -> {}
    
    animals.each_with_object({}) do |(k, v), h|
      h[v] = k
      puts "k -> #{k}, v -> #{v}, h -> #{ h.inspect }"
    end
    # k -> dogs, v -> 4, h -> {4=>"dogs"}
    # k -> cats, v -> 3, h -> {4=>"dogs", 3=>"cats"}
    # k -> dogs, v -> 7, h -> {4=>"dogs", 3=>"cats", 7=>"dogs"}
    

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2013-03-29
      • 2021-12-11
      • 2019-08-18
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多