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.
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']}.")