簡體   English   中英

紅寶石哈希中相同值的總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM