计算散列中值的唯一出现次数

问题描述 投票:0回答:4

我正在尝试计算与哈希中的正则表达式模式匹配的唯一值的出现次数。

如果有三个不同的值,多​​次,我想知道每个值出现了多少。

这是到目前为止我为实现该目的而开发的代码:

def trim(results)
  open = []

  results.map { |k, v| v }.each { |n| open << n.to_s.scan(/^closed/) }
  puts open.size
end

由于某种原因,它返回所有值的长度,而不仅仅是我尝试匹配的值。我也尝试使用results.each_value,但无济于事。

ruby hash
4个回答
1
投票

另一种方式:

hash = {a: 'foo', b: 'bar', c: 'baz', d: 'foo'}

hash.each_with_object(Hash.new(0)) {|(k,v),h| h[v]+=1 if v.start_with?('foo')} 
  #=> {"foo"=>2}

hash.each_with_object(Hash.new(0)) {|(k,v),h| h[v]+=1 if v =~ /^foo|bar/} 
  #=> {"foo"=>2, "bar"=>1}

1
投票

这样的事情?

hash = {a: 'foo', b: 'bar', c: 'baz', d: 'foo'}
groups = hash.group_by{ |k, v| v[/(?:foo|bar)/] } 
# => {"foo"=>[[:a, "foo"], [:d, "foo"]],
#     "bar"=>[[:b, "bar"]],
#     nil=>[[:c, "baz"]]}

注意,有一个nil键,这意味着该正则表达式不匹配任何内容。我们可以摆脱它,因为我们(可能)不在乎。或者,也许您确实关心,在这种情况下,请不要摆脱它。

groups.delete(nil)

这计算匹配的“匹配数”:

groups.map{ |k, v| [k, v.size] }
# => [["foo", 2], ["bar", 1]]

[group_by是一种神奇的方法,非常值得学习。


1
投票
group_by

对您有用吗?


0
投票

我认为值得为引入 def count(hash, pattern) hash.each_with_object({}) do |(k, v), counts| counts[k] = v.count{|s| s.to_s =~ pattern} end end h = { a: ['open', 'closed'], b: ['closed'] } count(h, /^closed/) => {:a=>1, :b=>1} RUBY_VERSION #=> "2.7.0"更新:

Enumerable#tally
© www.soinside.com 2019 - 2024. All rights reserved.