[英]Sum of same values in ruby hash
大家 我有哈希
{-2=>"a", -1=>"c", 1=>"a", 3=>"a", 49=>"a", -43=>"ab", 5=>"ab"}
值可以相等。 我的任務是對值相等的鍵求和。 結果:
{51=>"a", -1=>"c", -38=>"ab"}
我怎樣才能做到這一點?
hash.group_by{|key,val| val}
給出可怕的結果。
hash = {-2=>"a", -1=>"c", 1=>"a", 3=>"a", 49=>"a", -43=>"ab", 5=>"ab"}
hash.reduce({}) do |memo, (k,v)|
memo[v] ||= 0
memo[v] += k
memo
end.invert
# => {51=>"a", -1=>"c", -38=>"ab"}
reduce
使您可以通過迭代集合的值(在本例中為hash
建立新值。 有關更多信息,請參閱文檔 。
invert
-交換哈希的鍵和值。 有關更多信息,請參閱文檔 。
其他執行此操作的方法:
hash.reduce(Hash.new(0)) { |memo, (k,v)| memo[v] += k; memo }.invert
h = {-2=>"a", -1=>"c", 1=>"a", 3=>"a", 49=>"a", -43=>"ab", 5=>"ab"}
然后
h.group_by(&:last).each_with_object({}) { |(k,v),h| h[v.map(&:first).sum] = k }
#=> {51=>"a", -1=>"c", -38=>"ab"}
但這太瘋狂了,因為它依賴於唯一性。 (回想一下,哈希具有唯一的密鑰。)假設
h = {-54=>"a", -1=>"c", 1=>"a", 3=>"a", 49=>"a", -43=>"ab", 5=>"ab"}
然后
h.group_by(&:last).each_with_object({}) { |(k,v),h| h[v.map(&:first).sum] = k }
#=> {-1=>"c", -38=>"ab"}
因為-1=>"a"
被-1=<"c"
覆蓋。 我懷疑這是通緝犯。
最好將h
的內容保存在數組中:
a = [[-2, "a"], [-1, "c"], [-1, "a"], [49, "a"], [-43, "ab"], [5, "ab"]]
(因為它允許整數的重復值-此處為-1
),然后進行計算
a.group_by(&:last).each_with_object({}) { |(e,ar),h| h[e] = ar.map(&:first).sum }
#=> {"a"=>46, "c"=>-1, "ab"=>-38}
注意(對於h
的原始值)
h.group_by(&:last)
#=> {"a"=>[[-2, "a"], [1, "a"], [3, "a"], [49, "a"]],
# "c"=>[[-1, "c"]], "ab"=>[[-43, "ab"], [5, "ab"]]}
和v.map(&:first).sum
可以替換為
v.reduce(0) { |t,(n,_)| t+n }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.