Adloun

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.