É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 où 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.