Ruby 使用查找哈希从多个哈希求和
Ruby sum from multiple hashes with a lookup hash
我在 3 个单独的散列中有以下数据:
produce = {100=>"apples",200=>"oranges",300=>"pears"}
north = {100=>10,200=>7,300=>11}
south = {100=>5,200=>19,300=>0}
我需要所有地区所有农产品的库存盘点:
{"apples"=>15,"oranges"=>26,"pears"=>11}
有什么想法吗?
这里有两种方法。
#1
produce.each_with_object({}) do |(k,v),h|
h[v] = north[k].to_i + south[k].to_i
end
#=> {"apples"=>15, "oranges"=>26, "pears"=>11}
#2
h = produce.invert
#=> {"apples"=>100, "oranges"=>200, "pears"=>300}
h.keys.each { |k| h[k] = north[h[k]].to_i + south[h[k]].to_i }
h
#=> {"apples"=>15, "oranges"=>26, "pears"=>11}
我在 north
或 south
没有密钥 h[k]
的情况下附加了 to_i
,如 nil.to_i #=> 0
.
请注意,produce
的值必须是唯一的,才能获得您想要的结果。
这个怎么样:
Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
Hash#merge
合并两个散列。
如果两个散列具有相同的键而发生冲突,并且我们传递一个块,则使用键调用该块,一个散列的值,另一个散列的值并将结果存储为值.因此
north.merge(south) {|_, a, b| a + b}
求和部分:
north.merge(south) {|_, a, b| a + b}
#=> {100=>15, 200=>26, 300=>11}
接下来我们使用map
对sum hash的key进行改造:
north.merge(south) {|_, a, b| a + b}.map{ |k,v| [produce[k], v]}
#=> [["apples", 15], ["oranges", 26], ["pears", 11]]
由于这会产生一个数组,我们使用 Hash.[]
将其转换回散列:
Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
=> {"apples"=>15, "oranges"=>26, "pears"=>11}
我在 3 个单独的散列中有以下数据:
produce = {100=>"apples",200=>"oranges",300=>"pears"}
north = {100=>10,200=>7,300=>11}
south = {100=>5,200=>19,300=>0}
我需要所有地区所有农产品的库存盘点:
{"apples"=>15,"oranges"=>26,"pears"=>11}
有什么想法吗?
这里有两种方法。
#1
produce.each_with_object({}) do |(k,v),h|
h[v] = north[k].to_i + south[k].to_i
end
#=> {"apples"=>15, "oranges"=>26, "pears"=>11}
#2
h = produce.invert
#=> {"apples"=>100, "oranges"=>200, "pears"=>300}
h.keys.each { |k| h[k] = north[h[k]].to_i + south[h[k]].to_i }
h
#=> {"apples"=>15, "oranges"=>26, "pears"=>11}
我在 north
或 south
没有密钥 h[k]
的情况下附加了 to_i
,如 nil.to_i #=> 0
.
请注意,produce
的值必须是唯一的,才能获得您想要的结果。
这个怎么样:
Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
Hash#merge
合并两个散列。
如果两个散列具有相同的键而发生冲突,并且我们传递一个块,则使用键调用该块,一个散列的值,另一个散列的值并将结果存储为值.因此
north.merge(south) {|_, a, b| a + b}
求和部分:
north.merge(south) {|_, a, b| a + b}
#=> {100=>15, 200=>26, 300=>11}
接下来我们使用map
对sum hash的key进行改造:
north.merge(south) {|_, a, b| a + b}.map{ |k,v| [produce[k], v]}
#=> [["apples", 15], ["oranges", 26], ["pears", 11]]
由于这会产生一个数组,我们使用 Hash.[]
将其转换回散列:
Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
=> {"apples"=>15, "oranges"=>26, "pears"=>11}