gpt4 book ai didi

ruby - 按出现次数排序和显示项目

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:47 24 4
gpt4 key购买 nike

我发现自己反复想要计算数组中某个项目的出现次数,并显示最前面的项目及其实际数量。我已经多次编写如下代码,我认为它是一种反复出现的 RSI 诱导模式:

hits = Hash[ array.group_by{|o|o}.map{|o,a|[o,a.length]}.sort_by{|o,ct|[-ct,o]} ]

require 'pp'
pp hits

我可以将其移动到 Enumerable 上的 monkeypatch 中......

module Enumerable
def counts(&blk)
blk ||= ->(o){o}
Hash[ group_by(&blk).map{|o,a| [o,a.length] }.sort_by{|o,ct| [-ct,o] } ]
end
end

a = %w[a b a b c d e g j a e c d k o k i l p a e c f d e a d e f s d v c ]
pp a.counts
#=> {"a"=>5,
#=> "d"=>5,
#=> "e"=>5,
#=> "c"=>4,
#=> "b"=>2,
#=> "f"=>2,
#=> "k"=>2,
#=> "g"=>1,
#=> "i"=>1,
#=> "j"=>1,
#=> "l"=>1,
#=> "o"=>1,
#=> "p"=>1,
#=> "s"=>1,
#=> "v"=>1}

…但我想知道是否有更优雅的方法使用核心 Ruby 方法来完成此任务(更少的输入就足够了)。

最佳答案

ruby-1.9.2-p290 :041 > Hash[*[1,1,2,3,4,5,5,5].inject(Hash.new(0)) { |h,v| h[v] += 1; h }.sort_by{|k,v| v}.reverse.flatten]

=> {5=>3, 1=>2, 4=>1, 2=>1, 3=>1}

如果您想根据出现次数对列表进行排名,请听以下内容,

ruby-1.9.2-p290 :045 > [1,1,2,3,4,5,5,5].group_by{|x| x}.sort_by{|k, v| -v.size}.map(&:first)

=> [5, 1, 2, 4, 3]

关于ruby - 按出现次数排序和显示项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com