Ruby 使用查找哈希从多个哈希求和
我有3个单独的散列中的以下数据:Ruby 使用查找哈希从多个哈希求和,ruby,indexing,hash,sum,Ruby,Indexing,Hash,Sum,我有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} 有什么想法吗?这
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]
,我将附加到I
,作为nil.to#I=>0
请注意,product
的值必须是唯一的,才能获得所需的结果。如何:
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
转换求和散列的键:
north.merge(south) {|_, a, b| a + b}.map{ |k,v| [produce[k], v]}
#=> [["apples", 15], ["oranges", 26], ["pears", 11]]
由于这会产生一个数组,我们使用散列。[]
将其转换回散列:
Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
=> {"apples"=>15, "oranges"=>26, "pears"=>11}
欢迎来到堆栈溢出。不要要求我们向您提供代码,您应该向我们展示您的尝试,我们将帮助您修复。对于Ruby v2+,您可以使用
来_h
而不是将代码包装在散列[…]
中。