Grouper des emails par domaine

Résolu
okchf Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
okchf Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

Voila mon exercice python avec son exemple:

Écrire une fonction store_email(liste_mails) qui reçoit en paramètre une liste d’adresses e-mail et qui renvoie un dictionnaire avec comme clés les domaines des adresses e-mail et comme valeurs les listes d’utilisateurs correspondantes, triées par ordre croissant (UTF-8).

Exemple :

L’appel de la fonction suivant :

mails = [
    "jean@profs.ulb",
    "andre.colon@stud.ulb",
    "thierry@profs.ulb",
    "sébastien@prof.ur",
    "eric.ramzi@stud.ur",
    "bernard@profs.ulb",
    "ludo@prof.ur",
]

store_email(mails)

... renvoie le dictionnaire :

{ 'prof.ur' : ['ludo', 'sébastien'],
  'stud.ulb' : ['andre.colon'],
  'profs.ulb' : ['bernard', 'jean', 'thierry'],
  'stud.ur' : ['eric.ramzi'] }

Voila mon code :

 
d=([
    "jean@profs.ulb",
    "andre.colon@stud.ulb",
    "thierry@profs.ulb",
    "sébastien@prof.ur",
    "eric.ramzi@stud.ur",
    "bernard@profs.ulb",
    "ludo@prof.ur",
])
s = sorted(d)
data = dict({})
for i in range(0,len(d)):
    data[s[i]]= s[i]
print(data)

Je ne comprends vraiment pas comment les clés doivent renvoyer des domaines des adresses emails et les valeurs des listes d'utilisateurs. Comment transformer le paramètre en ça ?

Merci en avance!

2 réponses

clipot
 

Bonsoir, cela se fait avec la méthode split de la class str.

mails = [
    "jean@profs.ulb",
    "andre.colon@stud.ulb",
    "thierry@profs.ulb",
    "sébastien@prof.ur",
    "eric.ramzi@stud.ur",
    "bernard@profs.ulb",
    "ludo@prof.ur",
]

# s = sorted(d) # Inutile
# data = dict({}) # Là tu crées un dictionnaire dans un autre dictionnaire
data = {}
# for i in range(0, len(d)): # Inutile d'utiliser un range, préfère parcourir directement la liste
#     data[s[i]] = s[i]
# print(data)
for mail in mails:
    # Séparation nom d'utilisateur et nom de domaine
    user_name, domain_name = mail.split('@')
    # Ajout au dict data
    data.setdefault(domain_name, []).append(user_name)
    # Tri de la liste
    data[domain_name].sort()

from pprint import pprint
pprint(data)

La liste étant très courte, cela n'a aucune incidence de trier juste après chaque insertion, en revanche avec des centaines, milliers d'entrées, il sera plus performant de trier après avoir insérer toutes les données dans data, avec un parcours donc des listes des valeurs de data.

1
okchf Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 

Merci beaucoup pour votre effort. Vous m'aidez vraiment beaucoup à mieux comprendre.

0