Les tris avec Python

Tri et médiane avec Python

Comment trier une table avec Python ? La présentation qui suit peut être considérée comme ressource pour élèves de première générale (enseignement de NSI).

 

Tri en place

Le jeu de données est le fichier russes.csv que vous pouvez copier-coller à partir de la page d’agrégats avec Python. Si vous ne savez pas écrire le script pour l’importer, il se trouve en page d’exercice de sélection. Nous passerons directement à la fonction.

La table comporte quatre colonnes : le nom, le domaine d’activité, l’année de naissance et l’âge de décès. Ci-dessous nommée table, c’est une liste de dictionnaires.

Le script suivant retourne le denier nom par ordre alphabétique, ce qui suppose un tri.

def dernier_nom_alphabetique(table):
    noms = []

    for personne in table:
        noms.append(personne["Nom"])

    noms.sort()

    return noms[-1]

Nous avons créé la liste des noms (voir la génération d’une liste) avant de la trier. Pour obtenir un ordre décroissant, nous aurions écrit noms.sort(reverse=True).

Rappelons que [-1] appelle le dernier enregistrement. Il aurait fallu préciser [0] pour obtenir le premier, [1] pour le deuxième, etc.

 

Médiane

Un exercice intéressant consiste à trouver la médiane d’une série statistique, puisqu’il faut prélablement la trier. Nous devons envisager deux cas : celui d’un effectif impair (et la médiane est la valeur qui correspond à l’enregistrement du milieu) et celui d’un effectif pair (moyenne entre les deux enregistrements du milieu).

def annee_mediane(table):
    annees = []

    for personne in table:
        annees.append(int(personne["Naissance"]))

    annees.sort()

    n = len(annees)

    if n % 2 == 1:
        # impair
        return annees[n // 2]
    else:
# pair
        milieu1 = annees[n // 2 - 1]
        milieu2 = annees[n // 2]
        return (milieu1 + milieu2) / 2

 

Tri sur nouvelle liste

Nous avons utilisé la fonction sort() qui réordonne la liste. Au contraire, sorted() renvoie une nouvelle liste. Exemple :

noms = ["Tolstoï", "Lénine", "Gorki"]

nouvelle_liste = sorted(noms)

print(nouvelle_liste)
print(noms)

On obtient ceci :

['Gorki', 'Lénine', 'Tolstoï']
['Tolstoï', 'Lénine', 'Gorki']

La liste initiale est conservée.

 

Tri selon deux critères

Quel que soit l’outil, il est possible de trier sur deux caractères ou plus.

Nous souhaitons obtenir une table triée (avec sorted()) par année de naissance puis par ordre alphabétique.

def trier_table(table):
    return sorted(
        table,
        key=lambda personne: (
            int(personne["Naissance"]),
            personne["Nom"]
        )
    )
table_triee = trier_table(table)

for personne in table_triee:
    print(personne["Naissance"], personne["Nom"])

Pour chaque ligne, nous avons construit une clé de tri (key). Résultat :

1818 Tourgueniev
1821 Dostoïevski
1828 Tolstoï
1834 Mendeleïev
1849 Pavlov
1866 Kandinsky
1868 Gorki
1870 Lénine
1879 Malevitch
1879 Trotski
1882 Stravinsky
1887 Chagall
1888 Zadkine
1891 Prokofiev
1894 Khrouchtchev

Les dates de naissance sont triées. Seule l’année 1879 a vu naître deux célébrités : Malevich apparaît avant Trotski puisqu’il vient avant dans l’ordre alphabétique.

 

pandas

En milieu professionnel, on utilise les bibliothèques. D'ailleurs, le programme de première précise qu’une bibliothèque peut être employée. Pour le tri, pandas fait très bien l’affaire.

Reprenons notre question initiale : écrire le nom de la dernière personnalité par ordre alphabétique, mais cette fois-ci avec pandas.

import pandas as pd

# Chargement du fichier CSV
table = pd.read_csv("russes.csv", encoding="utf-16")

# Tri alphabétique sur la colonne Nom
table_triee = table.sort_values(by="Nom")

# Dernier nom
dernier_nom = table_triee.iloc[-1]["Nom"]

print("Dernier nom par ordre alphabétique :", dernier_nom)

C’est beaucoup plus compact ! Une seule ligne pour le tri et une autre pour retourner le dernier nom ! On aurait même pu le faire en une seule ligne :

dernier_nom = table.sort_values(by="Nom").iloc[-1]["Nom"]

 

tri