Aller au contenu

Trier les données d'un csv

Tri suivant une colonne

On utilise à nouveau le fichier personnes.csv.

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

Solution
import csv

# ouverture en lecture du fichier csv
with open('personnes.csv', newline='') as fichier:
    # on crée un objet DictReader
    lecture = csv.DictReader(fichier, delimiter=',')
    # transfo en liste
    lignes = list(lecture)



# on transforme en entiers les années de naissance: 
for personne in lignes:
    personne['anneeNaissance'] = int(personne['anneeNaissance'])



lignes.sort(key= lambda x: x['anneeNaissance'])

# affichage:
for personne in lignes:
    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:

Verse Alain 1970
Patamob Alphonse 1970
Etpan Ahmed 1975
Ainé Ali 1975
Térieur Alex 1976
Ficulté Andy 1980
Dajeun Bruno 1984
Gemlamorte Adèle 1985
Boréal Aurore 1985
Nor Paul 1985
Térieur Alain 1999
Labrosse Adam 2000
Proviste Alain 2000
Rectdustade Andy 2000
Hiple Candice 2000
Auboisdormant Abel 2001
Ception Alex 2001
Gator Ali 2001
Bistraux Alonzo 2001
Verserre Annie 2001
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.

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

Tri stable

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

Cette technique fonctionne grâce à la propriété de stabilité du tri appliqué par python.

Rappelons ce que cela signifie:

si deux éléments sont égaux vis à vis du tri appliqué, alors ils restent dans l'ordre dans lequel ils étaient au départ.

Lire par exemple le paragraphe wikipedia.

Solution
import csv

# ouverture en lecture du fichier csv
with open('personnes.csv', newline='') as fichier:
    # on crée un objet DictReader
    lecture = csv.DictReader(fichier, delimiter=',')
    # transfo en liste
    lignes = list(lecture)



# on transforme en entiers les âges: 
for personne in lignes:
    personne['anneeNaissance'] = int(personne['anneeNaissance'])


lignes.sort(key= lambda x: x['nom'])    
lignes.sort(key= lambda x: x['anneeNaissance'])

# affichage:
for personne in lignes:
    print(personne['nom'], personne['prenom'], personne['anneeNaissance'])

Avec le fichier titanic.csv

On utilise maintenant à nouveau la base titanic.

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.

Solution

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

import csv

# ouverture en lecture du fichier csv
with open('titanic.csv', newline='') as fichier:
    # on crée un objet DictReader
    lecture = csv.DictReader(fichier, delimiter='\t')
    # transfo en liste
    lignes = list(lecture)



# on transforme en entiers certaines chaînes: 
for personne in lignes:
    personne['Pclass'] = int(personne['Pclass'])
    personne['Age'] = int(personne['Age'])




survivants = [personne for personne in lignes if personne['Survived'] == '1']

survivants.sort(key= lambda x: x['Age'])      
survivants.sort(key= lambda x: x['Pclass'])    

# affichage:
for personne in survivants:
    print(f"Nom: {personne['Name']}, Classe: {personne['Pclass']}, Age: {personne['Age']}.")

Avec le fichier titanic.csv et en décroissant

Rappel

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

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

On utilise maintenant à nouveau la base 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
import csv

# ouverture en lecture du fichier csv
with open('titanic.csv', newline='') as fichier:
    # on crée un objet DictReader
    lecture = csv.DictReader(fichier, delimiter='\t')
    # transfo en liste
    lignes = list(lecture)



# on transforme en entiers certaines chaînes: 
for personne in lignes:
    personne['Pclass'] = int(personne['Pclass'])
    personne['Age'] = int(personne['Age'])




survivants = [personne for personne in lignes if personne['Survived'] == '1' and personne['Sex'] == 'male']

survivants.sort(key= lambda x: x['Age'], reverse= True)      
survivants.sort(key= lambda x: x['Pclass'])    

# affichage:
for personne in survivants:
    print(f"Nom: {personne['Name']}, Classe: {personne['Pclass']}, Age: {personne['Age']}.")