Массив хешей, как посчитать список «веб-страниц» с наиболее уникальными представлениями «страницы»? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь отобразить наиболее уникальные просмотры страниц по порядку, но не знаю, как. у меня есть переменная с данными:

data = [{"help_page/1"=>"126.318.035.038"},
 {"contact"=>"184.123.665.067"},
 {"home"=>"184.123.665.067"},
 {"about/2"=>"444.701.448.104"},
 {"help_page/1"=>"929.398.951.889"},
 {"index"=>"444.701.448.104"},
 {"help_page/1"=>"722.247.931.582"},
 {"about"=>"061.945.150.735"},
 {"help_page/1"=>"646.865.545.408"},
 {"home"=>"235.313.352.950"},
 {"help_page/1"=>"543.910.244.929"},
 {"home"=>"316.433.849.805"},
 {"contact"=>"543.910.244.929"}]

я пробовал что-то вроде этого:

data.sort_by {|k, v| -v.uniq.count}.collect{|k, v| "#{k}\t#{v.uniq.count} #{'unique views', v.uniq.count}"}

Я пытаюсь получить результаты, несколько похожие на приведенные ниже:

/help_page/1    XX unique views
/contact    XX unique views
/home   XX unique views
/index  XX unique views
/about/2    XX unique views
/about  XX unique views

но безуспешно.

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Мы можем использовать метод Enumerable # tally , новый в v2.7, для этого:

data.map { |h| h.keys.first }.
     tally.
     sort_by { |_,count| -count }.
     each { |k,v| puts "#{k}   #{v} unique views" }

отображает:

help_page/1   5 unique views
home   3 unique views
contact   2 unique views
about   1 unique views
index   1 unique views
about/2   1 unique views

шаги следующие.

a = data.map { |h| h.keys.first }
  #=> ["help_page/1", "contact", "home", "about/2", "help_page/1",
  #    "index", "help_page/1", "about", "help_page/1", "home",
  #    "help_page/1", "home", "contact"] 
b = a.tally
  #=> {"help_page/1"=>5, "contact"=>2, "home"=>3, "about/2"=>1,
  #    "index"=>1, "about"=>1} 
c = b.sort_by { |_,count| -count }
  #=> [["help_page/1", 5], ["home", 3], ["contact", 2], ["about", 1],
  #    ["index", 1], ["about/2", 1]]
c.each { |k,v| puts "#{k}   #{v} unique views" }
  #=> <displays the results shown above>
3 голосов
/ 07 января 2020

Enumerable#group_by - ваш друг, все остальное ниже просто форматирует вывод.

data.group_by do |h|
  h.to_a.first.first
end.map do |k, v|
  [k, v.count]
end.sort_by(&:last).reverse.to_h
#⇒ {"help_page/1"=>5,
#   "home"=>3,
#   "contact"=>2,
#   "about"=>1,
#   "index"=>1,
#   "about/2"=>1}
...