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
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.
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...
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'])
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
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']}.")
Tri secondaire avec le fichier titanic.csv et en décroissant
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)
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
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']}.")