2017-01-27 17 views
1

我有一個生成一個隨機的電子郵件地址的功能:從電子郵件地址列表中選擇最常用的域名

def emails 
    names = ["alfred", "daniel", "elisa", "ana", "ramzes"] 
    surnames = ["oak", "leaf", "grass", "fruit"] 
    providers = ["gmail", "yahoo", "outlook", "icloud"] 
    address = "#{names.sample}.#{surnames.sample}#{rand(100..5300)}@#{providers.sample}.com" 
end 

鑑於隨機生成的電子郵件地址的列表:

email_list = 100.times.map { emails } 

,看起來像這樣:

[email protected] 
[email protected] 
[email protected] 
... 

我該如何選擇最常見的提供者(「gmail」,「yahoo」等)?

+0

@AndreyDeineko:請注意,與「重複」相比有一個轉折點。 –

回答

0
email_list = 10.times.map { emails } 
    #=> ["[email protected]", "[email protected]", 
    # "[email protected]", "[email protected]", 
    # "[email protected]", "[email protected]", 
    # "[email protected]", "[email protected]", 
    # "[email protected]", "[email protected]"] 

email_list.group_by { |s| s[/@\K.+/] }.max_by { |_,v| v.size }.first 
    #=> "gmail.com" 

在正則表達式\K意味着不顧一切至今匹配。或者,@\K可能被替換正反向(?<[email protected])

步驟如下。

h = email_list.group_by { |s| s[/@\K.+/] } 
    #=> {"gmail.com" =>["[email protected]", "[email protected]", 
    #     "[email protected]"], 
    # "icloud.com" =>["[email protected]", "[email protected]"], 
    # "outlook.com"=>["[email protected]", "[email protected]", 
    #     "[email protected]"], 
    # "yahoo.com" =>["[email protected]", "[email protected]"]} 
a = h.max_by { |_,v| v.size } 
    #=> ["gmail.com", ["[email protected]", "[email protected]", 
    #     "[email protected]"]] 
a.first 
    #=> "gmail.com" 

如果像這裏那樣最頻繁出現平局,請修改代碼以獲得所有獲勝者。

h = email_list.group_by { |s| s[/@\K.+/] } 
    # (same as above) 
mx_size = h.map { |_,v| v.size }.max 
    #=> 3 
h.select { |_,v| v.size == mx_size }.keys 
    #=> ["gmail.com", "outlook.com"] 
2

您的問題與此相似one。然而,有一個轉折:你不想分析電子郵件地址的頻率,但他們的提供者。

def random_email 
    names = ["alfred", "daniel", "elisa", "ana", "ramzes"] 
    surnames = ["oak", "leaf", "grass", "fruit"] 
    providers = ["gmail", "yahoo", "outlook", "icloud"] 
    address = "#{names.sample}.#{surnames.sample}#{rand(100..5300)}@#{providers.sample}.com" 
end 

emails = Array.new(100){ random_email } 

freq = emails.each_with_object(Hash.new(0)) do |email,freq| 
    provider = email.split('@').last 
    freq[provider] += 1 
end 

p freq 
#=> {"outlook.com"=>24, "yahoo.com"=>28, "gmail.com"=>32, "icloud.com"=>16} 

p freq.max_by{|provider, count| count}.first 
#=> "gmail.com" 
+0

非常感謝!對此,我真的非常感激! – Ewelina

+0

你也可以爲最後一行代碼寫'freq.max_by(&:last).first'。 –

相關問題