Ruby哈希表中值的频率

4
如果我有一串书籍评分的哈希表,就像这样:
books = {"Gravity's Rainbow"=>:splendid,
         "House in Hyde Park"=>:splendid, 
         "The Week"=>:quite_good
        }

我希望能够计算特定值或评分的出现次数,应该怎么做?
我尝试了 books.values[:splendid].length - 但是我想它会出现错误,因为它认为我想要切片 "books.values" 中的一切,到 "splendid",这明显是错误的类型。
我该如何从 books.values 中删除除 ":splendid" 以外的所有内容?我应该查看列表操作而不是哈希吗?我对 Ruby 完全是新手,边打字边思考。虽然我不确定 books.values 返回的是列表还是其他类型?
2个回答

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}

以下是针对哈希表的代码更改,哈希表为{a: 5, b: 2, c: 3, d: 5},当值为2时输出应为1(=> 1),当值为5时输出应为2(=> 2)。 - avidCoder
@avidCoder,不会有任何代码更改,问题仍然存在。尽管现在你可以简单地使用hash.values.tally - Stefan
这是我使用的代码 - def value_count(hash, value) Hash[hash.group_by { |k, value| value }.map { |k, value| [k, value.count] }] end,但输出结果显示为2。我希望结果以这种格式呈现 - {5=>2, 2=>1, 3=>1}。 - avidCoder

4
使用 Enumerable 的 #count 方法
books.values.count { |v| v == :splendid }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接