我有一组类别及其值存储为哈希列表:
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