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.