Adloun

Écrire groupe par(table, colonne) , qui rend un dictionnaire associant…

Exercice de TD · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Sélectionner, projeter, agréger

Énoncé

Écrire groupe_par(table, colonne), qui rend un dictionnaire associant à chaque valeur de la colonne la sous-table des lignes qui la portent. En déduire l'effectif et la moyenne de chaque classe. Combien de parcours de la table cela demande-t-il ?

Corrigé


def groupe_par(table, colonne):
    """Dictionnaire : valeur de la colonne -> sous-table des lignes.

    Postcondition : la somme des longueurs des sous-tables vaut len(table),
                    et les sous-tables sont deux à deux disjointes.
    """
    groupes = {}
    for ligne in table:
        groupes.setdefault(ligne[colonne], []).append(ligne)
    return groupes

g = groupe_par(eleves, "classe")
{k: len(v) for k, v in g.items()}
# {'1G3': 2, '1G1': 2, '1G2': 1}
{k: moyenne_colonne(v, "moyenne") for k, v in g.items()}
# {'1G3': 12.5, '1G1': 12.5, '1G2': 17.25}

Contrôle : , l'effectif total de la table. Et pour la 1G3.

Un seul parcours. La boucle voit chaque ligne une fois : le coût est linéaire, opérations. L'autre façon — faire la liste des classes, puis, pour chacune, reparcourir la table — coûte est le nombre de classes. C'est exactement l'argument du cours sur les doublons : le dictionnaire remplace une double boucle par un simple parcours.

Piège : groupes[v].append(ligne) sans avoir créé la liste vide lève une KeyError au premier élément de chaque groupe. D'où setdefault, ou le if v not in groupes du chapitre 5.

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.