Trier les données d'un CSV

Tri suivant une colonne

On utilise à nouveau le fichier personnes.csv :

Question

Charger les données dans une liste de dictionnaires. Puis trier cette liste en ordre croissant des années de naissance.

Indice

Ne pas oublier de transformer en entier les années de naissance, puis on peut trier la liste et en afficher le contenu...

Solution

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet DictReader
6
    lecture = csv.DictReader(fichier, delimiter=',')
7
    # transfo en liste
8
    lignes = list(lecture)
9
10
# on transforme en entiers les années de naissance: 
11
for personne in lignes:
12
    personne['anneeNaissance'] = int(personne['anneeNaissance'])
13
14
lignes.sort(key= lambda x: x['anneeNaissance'])
15
16
# affichage:
17
for personne in lignes:
18
    print(personne['nom'], personne['prenom'], personne['anneeNaissance'])

Tri secondaire avec le fichier personnes.csv

Le résultat du tri donné en corrigé pour l'exercice précédent est :

1
Verse Alain 1970
2
Patamob Alphonse 1970
3
Etpan Ahmed 1975
4
Ainé Ali 1975
5
Térieur Alex 1976
6
Ficulté Andy 1980
7
Dajeun Bruno 1984
8
Gemlamorte Adèle 1985
9
Boréal Aurore 1985
10
Nor Paul 1985
11
Térieur Alain 1999
12
Labrosse Adam 2000
13
Proviste Alain 2000
14
Rectdustade Andy 2000
15
Hiple Candice 2000
16
Auboisdormant Abel 2001
17
Ception Alex 2001
18
Gator Ali 2001
19
Bistraux Alonzo 2001
20
Verserre Annie 2001
21
Dejeu Bernadette 2001

Les années de naissance sont bien en ordre croissant. Mais pour une année donnée, on aimerait que l'ordre soit l'ordre alphabétique des noms.

Ainsi Patamob devrait être affiché avant Verse.

Question

Réaliser ce tri en utilisant le principe exposé ci-dessous.

Principe :

Il suffit de trier d'abord suivant l'attribut nom. Puis on trie suivant l'attribut anneeNaissance.

Cette technique fonctionne grâce à une propriété du tri appliqué par python : si deux éléments sont égaux vis à vis du tri appliqué, alors ils restent dans l'ordre dans lequel ils étaient au départ. Pour mieux saisir cette notion, faîtes une recherche sur le web : un tel tri est dit stable. Lire par exemple le paragraphe wikipedia.

Solution

Finalement, il ne faut pas rajouter grand chose au code précédent...

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet DictReader
6
    lecture = csv.DictReader(fichier, delimiter=',')
7
    # transfo en liste
8
    lignes = list(lecture)
9
10
# on transforme en entiers les âges: 
11
for personne in lignes:
12
    personne['anneeNaissance'] = int(personne['anneeNaissance'])
13
14
lignes.sort(key= lambda x: x['nom'])    
15
lignes.sort(key= lambda x: x['anneeNaissance'])
16
17
# affichage:
18
for personne in lignes:
19
    print(personne['nom'], personne['prenom'], personne['anneeNaissance'])

Tri secondaire avec le fichier titanic.csv

On utilise maintenant à nouveau le fichier titanic.csv :

Question

Créer la liste des survivants puis trier cette liste dans l'ordre croissant des classes. Dans une même classe, trier suivant l'ordre croissant des âges.

Indice

Attention à bien trier d'abord suivant l'âge puis suivant la classe.

Solution

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('titanic.csv', newline='') as fichier:
5
    # on crée un objet DictReader
6
    lecture = csv.DictReader(fichier, delimiter='\t')
7
    # transfo en liste
8
    lignes = list(lecture)
9
10
# on transforme en entiers certaines chaînes: 
11
for personne in lignes:
12
    personne['Pclass'] = int(personne['Pclass'])
13
    personne['Age'] = int(personne['Age'])
14
15
survivants = [personne for personne in lignes if personne['Survived'] == '1']
16
17
survivants.sort(key= lambda x: x['Age'])      
18
survivants.sort(key= lambda x: x['Pclass'])    
19
20
# affichage:
21
for personne in survivants:
22
    print(f"Nom: {personne['Name']}, Classe: {personne['Pclass']}, Age: {personne['Age']}.")

Tri secondaire avec le fichier titanic.csv et en décroissant

On trie en ordre décroissant facilement avec le mot clef reverse:

1
notes = [ {"C1": 8, "C2": 12, "C3": 9}, 
2
          {"C1": 2,"C2": 18,"C3": 15}, 
3
          {"C1": 14,"C2": 13,"C3": 17}, 
4
          {"C1": 10,"C2": 11,"C3": 12}
5
         ]
6
# tri en ordre décroissant du premier résultat:
7
notes.sort(key= lambda x: x["C1"], reverse= True)

Question

Toujours avec le fichier titanic, créer la liste des hommes survivants puis trier cette liste dans l'ordre croissant des classes. Dans une même classe, trier suivant l'ordre décroissant des âges.

Solution

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('titanic.csv', newline='') as fichier:
5
    # on crée un objet DictReader
6
    lecture = csv.DictReader(fichier, delimiter='\t')
7
    # transfo en liste
8
    lignes = list(lecture)
9
10
# on transforme en entiers certaines chaînes: 
11
for personne in lignes:
12
    personne['Pclass'] = int(personne['Pclass'])
13
    personne['Age'] = int(personne['Age'])
14
15
survivants = [personne for personne in lignes if personne['Survived'] == '1' and personne['Sex'] == 'male']
16
17
survivants.sort(key= lambda x: x['Age'], reverse= True)      
18
survivants.sort(key= lambda x: x['Pclass'])    
19
20
# affichage:
21
for personne in survivants:
22
    print(f"Nom: {personne['Name']}, Classe: {personne['Pclass']}, Age: {personne['Age']}.")