LyCode Lab

Chapitre 4 : Fusion, clé commune, domaine de valeurs

Fusionner deux tables

Les données sont rarement toutes dans une seule table : ici, les œuvres d'un côté, les salles de l'autre. Pour savoir quel gardien surveille quelle œuvre, il faut fusionner les deux tables. L'idée : chercher dans la deuxième table la ligne qui correspond à chaque ligne de la première, grâce à un descripteur commun (la clé).

Au programme de NSI : Traitement de données en tables : Fusion de tables. Construire une nouvelle table en combinant les données de deux tables.

Une clé commune

oeuvres.csv : Chaque œuvre est dans une salle (colonne salle).
titre,salle,valeur
La Perle noire,S1,12000
Le Phare de nuit,S2,8500
Étoile de Port-Noir,S3,250000
Le Marin pensif,S2,4300
Carte des récifs,S4,1800
Le Grand Voilier,S1,9600
Masque de corail,S3,15000
Lanterne ancienne,S9,700
salles.csv : Chaque salle a un étage et un gardien.
salle,etage,gardien
S1,0,Armand
S2,0,Karim
S3,1,Sofia
S4,1,Karim

La colonne salle figure dans les deux tables : c'est la clé de la fusion. Pour une œuvre, on retrouve sa salle dans la table salles, et on récupère l'étage et le gardien. La table fusionnée possède les descripteurs des deux tables.

Fusionner avec deux boucles

La méthode la plus directe : pour chaque ligne de la première table, on parcourt la seconde et on cherche la ligne qui a la même clé. Quand on la trouve, on construit une nouvelle ligne qui rassemble les deux.

Une jointure avec deux boucles imbriquées
fusion = []
for oeuvre in oeuvres:
    for salle in salles:
        if oeuvre['salle'] == salle['salle']:
            ligne = dict(oeuvre)
            ligne['etage'] = salle['etage']
            ligne['gardien'] = salle['gardien']
            fusion.append(ligne)

Un dictionnaire d'index

Avec deux boucles imbriquées, on compare chaque œuvre à toutes les salles. Si l'on construit d'abord un dictionnaire dont les clés sont les valeurs de la clé de fusion, on retrouve la bonne ligne directement, sans reparcourir la table.

Index des salles, puis lecture directe
index = {salle['salle']: salle for salle in salles}

for oeuvre in oeuvres:
    if oeuvre['salle'] in index:
        print(oeuvre['titre'], index[oeuvre['salle']]['gardien'])

Le domaine de valeurs

Les valeurs possibles d'un descripteur forment son domaine de valeurs. Pour que la fusion soit complète, chaque valeur de la clé de la première table doit exister dans la seconde. Ce n'est pas toujours le cas : ici, la Lanterne ancienne est dans une salle S9 qui n'existe pas dans la table des salles.

À toi de jouer : Exercice guidé

Complète la fusion : une ligne est ajoutée à fusion quand la salle de l'œuvre est la même que celle de la table des salles. La variable nombre compte les lignes obtenues. La Lanterne ancienne n'a pas de salle connue : combien de lignes obtient-on ?

Passer à l'énigme : Qui surveille quoi ?