Adloun

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

Faire l'exercice suivant avec le tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →