Deux élèves peuvent porter le même nom sans que ce soit une erreur
Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 6 — Traiter des données en tables · Doublons, cohérence, domaines
Énoncé
Deux élèves peuvent porter le même nom sans que ce soit une erreur. Écrire doublons_composite(table, colonnes), qui cherche les doublons sur une combinaison de colonnes, et montrer sur un exemple que le résultat n'est pas celui de doublons colonne par colonne.
Corrigé
Une clé composite est un p-uplet (chapitre 4) : c'est ce qui permet de s'en servir comme clé de dictionnaire, un tableau ne le pourrait pas.
def doublons_composite(table, colonnes):
"""Combinaisons de valeurs qui apparaissent plus d'une fois.
Précondition : toutes les colonnes existent dans chaque ligne, et
leurs valeurs sont hachables (nombres, chaînes...).
"""
effectifs = {}
for ligne in table:
c = tuple(ligne[k] for k in colonnes)
effectifs[c] = effectifs.get(c, 0) + 1
return [c for c, n in effectifs.items() if n > 1]
Sur la table de quatre lignes : Nour en 1G3, Nour en 1G1, Yanis en 1G3 (deux fois),
| Clé | Doublons trouvés |
|---|---|
| `nom` | `['Nour', 'Yanis']` |
| `(nom, classe)` | `[('Yanis', '1G3')]` |
| `(nom, classe, moyenne)` | `[('Yanis', '1G3', 9.5)]` |
Ce que la comparaison enseigne. Sur la seule colonne nom, Nour est signalée — alors que ce sont deux personnes différentes, dans deux classes différentes : c'est un faux positif. Ajouter la classe le fait disparaître. Il ne reste que Yanis, dupliqué à l'identique : là, c'est un vrai doublon.
La leçon. Un doublon n'existe pas dans l'absolu : il existe par rapport à une clé. Choisir la clé, c'est décider ce qu'« être la même ligne » veut dire — et c'est une décision de conception, pas de programmation.
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.