Adloun

Que se passe-t-il si la clé de rapprochement n'est pas unique dans…

Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 6 — Traiter des données en tables · Trier et fusionner

Énoncé

Que se passe-t-il si la clé de rapprochement n'est pas unique dans table2 ? L'assertion de fusion l'interdit — écrire une variante qui, au lieu de refuser, produit toutes les combinaisons. Combien de lignes obtient-on si une valeur apparaît deux fois de chaque côté ?

Corrigé

Ce que l'assertion protège. L'index {ligne[cle]: ligne for ...} écrase les doublons : sur deux lignes de même clé, seule la dernière survit. La fusion rendrait alors un résultat de bonne taille mais partiellement faux — le pire cas. L'assertion transforme ce mensonge en refus franc.

La variante n:m. On indexe vers une liste de lignes, et l'on produit tous les appariements.


def fusion_multiple(table1, table2, cle):
    """Toutes les combinaisons de lignes partageant la même clé.

    Postcondition : le résultat compte sum(a[v] * b[v]) lignes, où a[v]
                    et b[v] sont les effectifs de la valeur v de part
                    et d'autre.
    """
    index = {}
    for ligne in table2:
        index.setdefault(ligne[cle], []).append(ligne)
    resultat = []
    for ligne in table1:
        for autre in index.get(ligne[cle], []):
            c = dict(ligne)
            c.update(autre)
            resultat.append(c)
    return resultat

Le décompte. Si une valeur de clé apparaît fois à gauche et fois à droite, elle produit lignes — chaque ligne de gauche s'apparie à chaque ligne de droite. Pour : quatre lignes. Vérification :


t1 = [{"cle": "a", "x": 1}, {"cle": "a", "x": 2}, {"cle": "b", "x": 3}]
t2 = [{"cle": "a", "y": 10}, {"cle": "a", "y": 20}, {"cle": "c", "y": 30}]
len(fusion_multiple(t1, t2, "cle"))    # 4

Et la loi générale a été vérifiée sur tables tirées au hasard : aucune assertion ne se déclenche.

À retenir : la clé "b" est absente de t2, la clé "c" absente de t1 — ni l'une ni l'autre n'apparaît dans le résultat, puisque dès qu'un des deux effectifs est nul. Une fusion perd toujours les clés non partagées ; c'est l'exercice 9 de la banque suivante qui montre comment ne pas les perdre.

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.