我有一系列电子邮件地址(大约超过50,000),我有兴趣计算特定电子邮件域的频率。例如,如果我有
emails = [
'Johndoe@gmail.com',
'Johndoe@yahoo.com',
'Johndoe@aol.com',
'Johndoe@someuni.xyz.com',
'Janedoe@gmail.com'
]
我对哪个电子邮件域名出现最感兴趣,我希望以频率'gmail'
返回2
。
要做到这一点,我认为最好通过数组并丢弃@
之前发生的所有事情,并将域保持为新数组,然后我可以迭代。我该怎么做?
答案 0 :(得分:5)
假设您的电子邮件是string
,您可以执行以下操作:
emails = ["Johndoe@gmail.com", "Johndoe@yahoo.com", "Johndoe@aol.com", "Johndoe@someuni.xyz.com", "Janedoe@gmail.com"]
counts = Hash.new(0)
emails.each { |t| counts[t.partition("@").last] += 1}
counts #{"gmail.com"=>2, "yahoo.com"=>1, "aol.com"=>1, "someuni.xyz.com"=>1}
答案 1 :(得分:3)
类似于mudasobwa的回答。
emails
.group_by{|s| s.partition("@").last}
.map{|k, v| [k, v.length]}
.max_by(&:last)
# => ["gmail.com", 2]
答案 2 :(得分:2)
emails.map { |e| e.split('@').last } # leave domains
.group_by { |s| s } # group
.map { |k, v| [k, v.count] } # count
.sort_by(&:last) # sort
.last # get results
#⇒ ["gmail.com", 2]
答案 3 :(得分:2)
我认为将域保持为新数组是个好主意,然后我可以迭代。我该怎么做?
您应该使用适当的库来解析电子邮件地址,例如Mail gem。它附带了一个实用程序类Mail::Address
,可以轻松访问地址字段:
require 'mail'
emails = %w[
Johndoe@gmail.com
Johndoe@yahoo.com
Johndoe@aol.com
Johndoe@someuni.xyz.com
Janedoe@gmail.com
]
domains = emails.map { |email| Mail::Address.new(email).domain }
#=> ["gmail.com", "yahoo.com", "aol.com", "someuni.xyz.com", "gmail.com"]
它还可以处理更复杂的地址格式。来自documentation:
a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.format #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
a.address #=> 'mikel@test.lindsaar.net'
a.display_name #=> 'Mikel Lindsaar'
a.local #=> 'mikel'
a.domain #=> 'test.lindsaar.net'
a.comments #=> ['My email address']
a.to_s #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'