Grouper des emails par domaine

Résolu/Fermé
okchf Messages postés 8 Date d'inscription jeudi 3 novembre 2022 Statut Membre Dernière intervention 18 novembre 2022 - Modifié le 8 nov. 2022 à 15:04
okchf Messages postés 8 Date d'inscription jeudi 3 novembre 2022 Statut Membre Dernière intervention 18 novembre 2022 - 6 nov. 2022 à 13:12

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

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 jeudi 3 novembre 2022 Statut Membre Dernière intervention 18 novembre 2022
6 nov. 2022 à 13:12

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

0