Adloun

É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 :

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.