散列数组,如何统计 'webpages' 具有最独特 'page' 视图的列表?
Array of hashes, how to count the list of 'webpages' with most unique 'page' views?
我试图按顺序显示最独特的页面浏览量,但不确定如何显示。我有数据变量:
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
但没有成功。
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}
我们可以使用 v2.7 中新增的方法 Enumerable#tally:
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>
我试图按顺序显示最独特的页面浏览量,但不确定如何显示。我有数据变量:
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
但没有成功。
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}
我们可以使用 v2.7 中新增的方法 Enumerable#tally:
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>