Ruby散列中的值的频率

时间:2013-10-02 14:59:12

标签: ruby hash dictionary

如果我有像

这样的图书评级
books = {"Gravity's Rainbow"=>:splendid,
         "House in Hyde Park"=>:splendid, 
         "The Week"=>:quite_good
        }

我想计算特定值或评级的出现次数,这是怎么做的?

我试过了books.values[:splendid].length - 但我想错误是因为它认为我想把所有内容从“books.values”中切割成“出色”,这是错误的类型。

如何从books.values删除所有不是“:splendid”的内容?我应该查看列表操作而不是哈希?我是Ruby的新手,在我输入时思考。我不确定books.values是否已返回列表或其他类型?

2 个答案:

答案 0 :(得分:7)

books.values返回一个数组:

books.values
#=> [:splendid, :splendid, :quite_good]

所以你可以使用Array#count

books.values.count(:splendid)
#=> 2

或类似的东西来计算所有值:

Hash[books.group_by { |k, v| v }.map { |k, v| [k, v.count] }]
#=> {:splendid=>2, :quite_good=>1}

答案 1 :(得分:4)

使用Enumerable的#count method

books.values.count { |v| v == :splendid }

正如@Stefan回答的那样,你也可以通过books.values.count(:splendid)

来缩短它