La fusion du cours perd les lignes sans correspondance
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Fusionner sans rien perdre
Énoncé
La fusion du cours perd les lignes sans correspondance. Écrire fusion_gauche, qui garde toutes les lignes de la première table et remplit les colonnes manquantes par une valeur convenue.
Corrigé
def fusion_gauche(table1, table2, cle, defaut=None):
"""Fusion qui conserve toutes les lignes de table1.
Précondition : la clé est unique dans table2.
Postcondition : len(résultat) == len(table1), exactement.
"""
assert len(doublons(table2, cle)) == 0, "cle non unique dans table2"
colonnes2 = [c for c in (table2[0] if table2 else {}) if c != cle]
index = {l[cle]: l for l in table2}
res = []
for ligne in table1:
c = dict(ligne)
if ligne[cle] in index:
c.update(index[ligne[cle]])
else:
for col in colonnes2:
c[col] = defaut
res.append(c)
return res
Contrôle. En retirant la 1G2 de la table des classes, la fusion du cours rend quatre lignes ; fusion_gauche en rend cinq, dont celle de Sofia avec 'salle': None.
La postcondition change de nature. Celle du cours est une inégalité (<= len(table1)) ; celle-ci est une égalité. C'est tout l'intérêt : on ne se demande plus si l'on a perdu des lignes, on sait qu'on n'en a pas perdu. Le prix est le None qui apparaît dans la table, et qu'il faudra traiter en aval — un None qui traverse un calcul lève une exception, alors qu'une ligne disparue ne dit rien.
Vocabulaire de terminale : c'est la jointure externe gauche du modèle relationnel.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.