NSI (première) · Chapitre 6 · Exercice de TD
Écrire groupe par(table, colonne) , qui rend un dictionnaire associant…
Traiter des données en tables · Sélectionner, projeter, agréger · niveau 2
É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.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.