Jointure de dictionnaires⚓︎
Le responsable d'un site web dispose de deux tableaux contenant des informations sur les abonnés du site :
- le premier tableau contient l'adresse email de chaque abonné ainsi que son identifiant (un nombre entier unique)
- le second tableau contient l'identifiant de certains abonnés ainsi que leur "pseudo"
Toutes les adresses email et tous les identifiants sont uniques.
Par exemple :
- le premier tableau
ID | |
---|---|
alice@fake.com | 1 |
bob@bidon.fr | 2 |
chris@false.uk | 3 |
- le second tableau :
ID | Pseudo |
---|---|
1 | alice |
2 | B0b |
Comme on peut le voir, le second tableau ne contient pas nécessairement les informations de tous les abonnés.
Ces tableaux sont codés en Python sous forme de dictionnaires. On aura ainsi :
emails_ids = {'alice@fake.com': 1, 'bob@bidon.fr': 2, 'chris@false.uk': 3}
ids_pseudos = {1: 'alice', 2: 'B0b'}
Le responsable du site vous demande d'associer à chaque adresse email, le pseudo correspondant. Si un abonné n'a pas de pseudo associé, on donnera son adresse email à la place.
Vous devez donc écrire en Python la fonction jointure
qui :
- prend en argument les deux dictionnaires
- renvoie le dictionnaire dont les clés sont les adresses email des abonnés et les valeurs leur pseudo (ou leur adresse email s'ils n'ont pas renseigné de pseudo).
Exemples
>>> emails_ids = {'alice@fake.com': 1, 'bob@bidon.fr': 2, 'chris@false.uk': 3}
>>> ids_pseudos = {1: 'alice', 2: 'B0b', 3: 'ChristoF'}
>>> jointure(emails_ids, ids_pseudos)
{'alice@fake.com': 'alice', 'bob@bidon.fr': 'B0b', 'chris@false.uk': 'ChristoF'}
>>> emails_ids = {'alice@fake.com': 1, 'bob@bidon.fr': 2, 'chris@false.uk': 3}
>>> ids_pseudos = {1: 'alice', 2: 'B0b'}
>>> jointure(emails_ids, ids_pseudos)
{'alice@fake.com': 'alice', 'bob@bidon.fr': 'B0b', 'chris@false.uk': 'chris@false.uk'}
def jointure(emailspy-undids, idspy-undpseudos):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlemailspy-undids = {"alice@fake.com": 1, "bob@bidon.fr": 2, "chris@false.uk": 3}bksl-nlidspy-undpseudos = {1: "alice", 2: "B0b", 3: "ChristoF"}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {bksl-nl "alice@fake.com": "alice",bksl-nl "bob@bidon.fr": "B0b",bksl-nl "chris@false.uk": "ChristoF",bksl-nl}bksl-nlbksl-nlemailspy-undids = {"alice@fake.com": 1, "bob@bidon.fr": 2, "chris@false.uk": 3}bksl-nlidspy-undpseudos = {1: "alice", 2: "B0b"}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {bksl-nl "alice@fake.com": "alice",bksl-nl "bob@bidon.fr": "B0b",bksl-nl "chris@false.uk": "chris@false.uk",bksl-nl}bksl-nlbksl-nlemailspy-undids = {"alice@fake.com": 5, "bob@bidon.fr": 6, "chris@false.uk": 3}bksl-nlidspy-undpseudos = {5: "Alic3", 3: "ChristoF"}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {bksl-nl "alice@fake.com": "Alic3",bksl-nl "bob@bidon.fr": "bob@bidon.fr",bksl-nl "chris@false.uk": "ChristoF",bksl-nl}bksl-nlbksl-nldef jointure(emailspy-undids, idspy-undpseudos):bksl-nl emailspy-undpseudos = {}bksl-nl for email in emailspy-undids:bksl-nl identifiant = emailspy-undids[email]bksl-nl if identifiant in idspy-undpseudos:bksl-nl emailspy-undpseudos[email] = idspy-undpseudos[identifiant]bksl-nl else:bksl-nl emailspy-undpseudos[email] = emailbksl-nl return emailspy-undpseudosbksl-nlbksl-nl# Testsbksl-nlemailspy-undids = {"alice@fake.com": 1, "bob@bidon.fr": 2, "chris@false.uk": 3}bksl-nlidspy-undpseudos = {1: "alice", 2: "B0b", 3: "ChristoF"}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {bksl-nl "alice@fake.com": "alice",bksl-nl "bob@bidon.fr": "B0b",bksl-nl "chris@false.uk": "ChristoF",bksl-nl}bksl-nlbksl-nlemailspy-undids = {"alice@fake.com": 1, "bob@bidon.fr": 2, "chris@false.uk": 3}bksl-nlidspy-undpseudos = {1: "alice", 2: "B0b"}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {bksl-nl "alice@fake.com": "alice",bksl-nl "bob@bidon.fr": "B0b",bksl-nl "chris@false.uk": "chris@false.uk",bksl-nl}bksl-nlbksl-nlemailspy-undids = {"alice@fake.com": 5, "bob@bidon.fr": 6, "chris@false.uk": 3}bksl-nlidspy-undpseudos = {5: "Alic3", 3: "ChristoF"}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {bksl-nl "alice@fake.com": "Alic3",bksl-nl "bob@bidon.fr": "bob@bidon.fr",bksl-nl "chris@false.uk": "ChristoF",bksl-nl}bksl-nlbksl-nl
A
On débute par la création d'un dictionnaire vide emails_pseudos
qui contiendra les informations souhaitées.
On parcourt ensuite l'ensemble des clés du dictionnaire emails_ids
. Par construction ce sont les adresses email de tous les abonnés.
Dans chaque cas, on vérifie que l'id correspondante est une clé du second dictionnaire : emails_ids[email]
in ids_pseudos
. Si oui, on ajoute le pseudo correspondant dans le dictionnaire emails_pseudos
. Si non, on ajoute l'adresse email comme valeur.
Autre solution⚓︎
La méthode items
des dictionnaires permet de parcourir les couples (clé, valeur)
d'un dictionnaire. On peut l'utiliser afin de simplifier le parcours :
def jointure(emails_ids, ids_pseudos):
emails_pseudos = {}
for email, identifiant in emails_ids.items():
if identifiant in ids_pseudos:
emails_pseudos[email] = ids_pseudos[identifiant]
else:
emails_pseudos[email] = email
return emails_pseudos
Z