Aller au contenu

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
Email 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 :

🐍 Script Python
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

🐍 Console Python
>>> 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'}
🐍 Console Python
>>> 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'}

###
# 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# Tests supplémentairesbksl-nlemailspy-undids = {"alice@fake.com": 5, "bob@bidon.fr": 6, "chris@false.uk": 3}bksl-nlidspy-undpseudos = {}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {bksl-nl "alice@fake.com": "alice@fake.com",bksl-nl "bob@bidon.fr": "bob@bidon.fr",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 = {3: "ChristoF", 6: "B0b", 5: "alice"}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-nlemailspy-undids = {}bksl-nlidspy-undpseudos = {}bksl-nlassert jointure(emailspy-undids, idspy-undpseudos) == {}bksl-nlbksl-nl 5/5

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

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 :

🐍 Script Python
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