列表我有一組類別和它們的值存儲爲散列的列表:創建嵌套的哈希值從哈希值的紅寶石
r = [{:A => :X}, {:A => :Y}, {:B => :X}, {:A => :X}, {:A => :Z}, {:A => :X},
{:A => :X}, {:B => :Z}, {:C => :X}, {:C => :Y}, {:B => :X}, {:C => :Y},
{:C => :Y}]
我想獲得再加上每個值的計數其類別作爲這樣的散列:
{:A => {:X => 4, :Y => 1, :Z => 1},
:B => {:X => 2, :Z => 1},
:C => {:X => 1, :Y => 3}}
我該如何有效地做到這一點?
這是我迄今(它返回不一致的值):
r.reduce(Hash.new(Hash.new(0))) do |memo, x|
memo[x.keys.first][x.values.first] += 1
memo
end
我應該首先計算特定{:cat => :val}
S的所有實例的計數,然後創建哈希?我是否應該給出一個不同的基本案例來減少和更改身體檢查nil
個案(並在nil
時指定零),而不是始終添加1?
編輯:
我最終改變我的代碼,並使用下面的方法有實現嵌套散列的更清潔的方式:
r.map do |x|
[x.keys.first, x.values.last]
end.reduce({}) do |memo, x|
memo[x.first] = Hash.new(0) if memo[x.first].nil?
memo[x.first][x.last] += 1
memo
end
謝謝,這解釋了我遇到的問題。 – maksim