Écrire types par colonne(table) , qui rend l'ensemble des types…
Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 6 — Traiter des données en tables · Données sales et formats mal formés
Énoncé
Écrire types_par_colonne(table), qui rend l'ensemble des types rencontrés dans chaque colonne. Que doit-on conclure d'une colonne à plusieurs types ?
Corrigé
def types_par_colonne(table):
"""Types rencontrés, colonne par colonne.
Postcondition : une colonne saine rend une liste d'un seul élément.
"""
res = {}
for ligne in table:
for c, v in ligne.items():
res.setdefault(c, set()).add(type(v).__name__)
return {c: sorted(t) for c, t in res.items()}
Sur la table eleves convertie : {'nom': ['str'], 'classe': ['str'], 'moyenne': ['float'], 'option': ['str']} — chaque colonne a un type et un seul.
Sur une table abîmée : {'n': ['int'], 'x': ['NoneType', 'float', 'str']}. La colonne x porte trois types.
Ce qu'il faut en conclure. Trois causes possibles, à distinguer :
- une conversion partielle — l'exercice de la banque précédente : la table a été laissée à moitié convertie par une exception ;
- des valeurs manquantes représentées par
Noneau milieu de nombres ; - deux fichiers concaténés dont l'un a été converti et l'autre non.
Dans les trois cas, tout tri et toute comparaison sur cette colonne sont désormais du hasard : en Python 3, comparer un str à un float lève une TypeError — ce qui, pour une fois, est une bonne nouvelle : l'erreur est bruyante.
Le contrôle tient en une ligne, et devrait suivre tout import :
assert all(len(t) == 1 for t in types_par_colonne(table).values())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.