【问题标题】:Frequency of value in Ruby hashRuby 哈希值的频率
【发布时间】:2013-10-09 00:34:01
【问题描述】:

如果我有一个像

这样的图书评分哈希值
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 是否返回了列表或其他类型?

【问题讨论】:

    标签: ruby hash dictionary


    【解决方案1】:

    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 不会有任何代码更改,这是同样的问题。虽然现在你可以简单地使用hash.values.tally
    • 这是我用过的 - def value_count(hash, value) Hash[hash.group_by { |k, value|值 }.map { |k, 值| [k, value.count] }] 结束。但它显示的输出是 2。我想要这种格式的结果 - {5=>2, 2=>1, 3=>1}
    【解决方案2】:

    使用 Enumerable 的 #count method:

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

    正如@Stefan 回答的那样,您也可以将其缩短为 books.values.count(:splendid)

    【讨论】:

      猜你喜欢
      • 2016-03-07
      • 2011-06-30
      • 2020-03-20
      • 2014-04-09
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      相关资源
      最近更新 更多