Chapitre 3 : Tri suivant une colonne, sorted et key
Trier une table
Un classement, un palmarès, une liste alphabétique : trier est l'une des opérations les plus courantes sur une table. Python fournit une fonction de tri intégrée : tu n'as pas à écrire l'algorithme, mais tu dois lui dire suivant quelle colonne classer les lignes.
Au programme de NSI : Traitement de données en tables : Tri d'une table. Trier une table suivant une colonne.
La fonction sorted et le paramètre key
sorted(t) renvoie un nouveau tableau trié, sans modifier t. Pour trier des lignes (des dictionnaires), il faut indiquer la valeur à comparer pour chaque ligne : c'est le paramètre key, une fonction qui prend une ligne et renvoie la valeur de tri.
import csv
with open('visiteurs.csv', encoding='utf-8') as f:
table = list(csv.DictReader(f))
par_age = sorted(table, key=lambda ligne: int(ligne['age']))
print([ligne['nom'] for ligne in par_age])Ordre décroissant et tri en place
reverse=True inverse l'ordre : du plus grand au plus petit. La méthode t.sort(...) fait la même chose mais modifie le tableau lui-même (et ne renvoie rien). Le tri de Python est stable : deux lignes qui ont la même valeur de tri gardent leur ordre d'origine.
par_age = sorted(table, key=lambda l: int(l['age']), reverse=True)
trois = par_age[:3]
print([l['nom'] for l in trois])Trier suivant plusieurs colonnes
Pour classer d'abord par une colonne, puis par une autre en cas d'égalité, la fonction key renvoie un p-uplet : Python compare les p-uplets élément par élément.
classement = sorted(table, key=lambda l: (l['ville'], l['nom']))
print([(l['ville'], l['nom']) for l in classement])Le piège des nombres écrits en texte
objet,poids
bague,9
collier,120
montre,45
broche,8
diademe,1000
bracelet,60
poids = ['9', '120', '45', '8', '1000', '60']
print(sorted(poids))
print(sorted(poids, key=int))À toi de jouer : Exercice guidé
Trie la table par âge croissant (en nombres) et range dans noms les noms des visiteurs dans cet ordre. Complète la fonction key.