Une table porte des classes écrites " 1G3 ", "1g1", "1G2"
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Données sales et formats mal formés
Énoncé
Une table porte des classes écrites " 1G3 ", "1g1", "1G2". Normaliser la colonne des deux côtés avant la fusion, et compter les lignes récupérées.
Corrigé
def normaliser(table, colonne):
"""Retire les espaces de bord et ramène à une casse unique, sur place.
Précondition : la colonne contient des chaînes.
"""
for ligne in table:
ligne[colonne] = ligne[colonne].strip().casefold()
Le décompte. Sur cinq élèves dont trois portent une écriture fautive : la fusion brute rend trois lignes ; après normalisation des deux tables, elle en rend cinq. Deux lignes récupérées, soit % de la table.
Des deux côtés, impérativement. Normaliser la seule table des élèves ne suffirait pas : "1g3" ne s'apparie pas davantage à "1G3" qu'à " 1G3 ". La comparaison étant une égalité, il faut que les deux membres passent par la même transformation.
casefold plutôt que lower. Les deux coïncident sur l'alphabet latin sans accent, mais casefold traite des cas que lower laisse passer — l'allemand ß et ss, par exemple. Sur des données européennes réelles, la différence finit par se voir.
Le revers. Normaliser détruit de l'information : on ne peut plus distinguer deux valeurs qui ne différaient que par la casse. Si cette distinction est signifiante — des identifiants sensibles à la casse — la normalisation crée des faux appariements, ce qui est pire que le problème qu'elle résout. Normaliser une clé est une décision, pas une hygiène automatique.
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.