Adloun

Trier la table par nom, puis par moyenne décroissante, puis par classe…

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Trier, agréger, résumer

Énoncé

Trier la table par nom, puis par moyenne décroissante, puis par classe croissante et moyenne décroissante. Vérifier que la table d'origine n'a pas été modifiée.

Corrigé


par_nom     = sorted(eleves, key=lambda l: l["nom"])
par_moyenne = sorted(eleves, key=lambda l: l["moyenne"], reverse=True)
par_deux    = sorted(eleves, key=lambda l: (l["classe"], -l["moyenne"]))
Clé de triOrdre obtenu
`nom`Adam, Camille, Nour, Sofia, Yanis
`moyenne` décroissanteSofia, Nour, Adam, Camille, Yanis
`(classe, -moyenne)`1G1 : Adam, Camille ; 1G2 : Sofia ; 1G3 : Nour, Yanis

Le double tri se lit dans le résultat. Les classes montent — 1G1, 1G2, 1G3 — et, à l'intérieur de la 1G1, Adam () précède Camille () : la moyenne y descend bien. Le signe moins n'agit que sur la seconde composante du p-uplet, ce que reverse=True n'aurait pas permis puisqu'il aurait aussi renversé les classes.

La table est intacte. sorted construit une table neuve :


avant = [l["nom"] for l in eleves]
# ... les trois tris ...
assert [l["nom"] for l in eleves] == avant     # passe

À distinguer : eleves.sort(key=...) trierait sur place et détruirait l'ordre d'origine. Quand on veut plusieurs vues d'une même table, c'est sorted qu'il faut.

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.