Traitement de données en tables
Le lycée publie la liste des élèves inscrits aux clubs du jeudi : un tableur avec des centaines de lignes. Comment un programme Python peut-il retrouver les élèves de Lille, trier la liste par âge ou y ajouter le nom de la salle de chaque club ? Il suffit de savoir lire une table et de la manipuler avec les types construits de Python.
Qu'est-ce qu'une table ? Le format CSV
Une table est un ensemble d'enregistrements (les lignes) qui ont tous les mêmes champs (les colonnes). Chaque champ porte un nom, le descripteur.
Un fichier CSV (Comma-Separated Values) est un fichier texte qui stocke une table : une ligne par enregistrement, les champs séparés par un séparateur (souvent la virgule, parfois le point-virgule ou la tabulation). La première ligne contient en général les descripteurs.
En Python, on représente une table par une liste de dictionnaires : chaque dictionnaire est un enregistrement, ses clés sont les descripteurs.
t = [
{"nom": "Durand", "ville": "Lille", "age": 17},
{"nom": "Petit", "ville": "Nice", "age": 16},
]
print(t[0]["ville"]) # Lille
Voici le contenu d'un fichier CSV : a) Quel est le séparateur de champs ? Quels sont les descripteurs ? b) Combien d'enregistrements contient la table ? c) Représenter…
Voici le contenu d'un fichier CSV :
nom,ville,age
Durand,Lille,17
Petit,Nice,16
Roux,Lille,16
- a) Quel est le séparateur de champs ? Quels sont les descripteurs ?
- b) Combien d'enregistrements contient la table ?
- c) Représenter cette table sous forme d'une liste de dictionnaires en Python.
Importer un fichier CSV
Le module csv de la bibliothèque standard lit un fichier. Avec DictReader, la première ligne fournit les clés des dictionnaires.
Écrire en Python les instructions qui ouvrent le fichier eleves.csv (encodage UTF-8), le lisent avec csv.DictReader et stockent les enregistrements dans une liste table.…
Écrire en Python les instructions qui ouvrent le fichier eleves.csv (encodage UTF-8), le lisent avec csv.DictReader et stockent les enregistrements dans une liste table. Préciser comment fermer correctement le fichier.
Rechercher dans une table
Chercher, c'est sélectionner les enregistrements qui vérifient un critère, exprimé avec ==, <, and, or, not. La compréhension est l'outil idéal.
lillois = [e for e in t if e["ville"] == "Lille"]
noms_16 = [e["nom"] for e in t if e["age"] == 16]
t.append({"nom": "Blanc", "ville": "Brest", "age": 17})
Pour combiner deux critères : [e for e in t if e["ville"] == "Lille" and e["age"] >= 17].
Doublons et cohérence
Deux contrôles classiques sur une table :
-
repérer les doublons (même valeur dans un champ qui devrait être unique) ;
-
tester la cohérence : champs non vides, valeurs dans le bon domaine (âge entre 0 et 120, mail contenant
@).
On dispose de la table t, liste de dictionnaires, avec les champs nom, ville, age de l'exercice précédent. Chaque enregistrement est de la forme {"nom": "Martin",…
On dispose de la table t, liste de dictionnaires, avec les champs nom, ville, age de l'exercice précédent. Chaque enregistrement est de la forme {"nom": "Martin", "ville": "Lille", "age": 16} : le champ age est un entier.
- a) Écrire une compréhension qui renvoie la liste des enregistrements dont la ville est
"Lille".
- b) Écrire une compréhension qui renvoie la liste des noms des élèves d'âge 16.
- c) Écrire une instruction qui ajoute l'enregistrement de Blanc, Brest, 17 ans.
Une table villes contient les champs nom, region, population (entier) et superficie (en km²). a) Écrire une compréhension qui renvoie les villes de la région "Bretagne"…
Une table villes contient les champs nom, region, population (entier) et superficie (en km²).
- a) Écrire une compréhension qui renvoie les villes de la région
"Bretagne"de plus de 50 000 habitants.
- b) Écrire une fonction qui renvoie la moyenne des densités (population divisée par superficie) de chaque ville de la table.
- c) Trier la table par population décroissante avec
sortedet une fonctionkey.
Une table inscrits est une liste de dictionnaires avec les champs id, nom, mail. a) Écrire une fonction doublons(table) qui renvoie la liste des adresses mail…
Une table inscrits est une liste de dictionnaires avec les champs id, nom, mail.
- a) Écrire une fonction
doublons(table)qui renvoie la liste des adresses mail apparaissant plus d'une fois.
- b) Écrire une fonction
coherente(table)qui renvoieTruesi tous les champs de chaque enregistrement sont non vides et si le mail contient le caractère@.
- c) Expliquer pourquoi l'utilisation d'un dictionnaire améliore l'efficacité de la recherche de doublons par rapport à deux boucles imbriquées.
Trier une table
La fonction sorted(table, key=...) renvoie une nouvelle liste triée ; table.sort(key=...) trie sur place. L'argument key est une fonction qui, à un enregistrement, associe la valeur de comparaison. L'option reverse=True donne l'ordre décroissant.
def age(e):
return int(e["age"])
par_age = sorted(t, key=age)
par_age_decroissant = sorted(t, key=age, reverse=True)
par_nom = sorted(t, key=lambda e: e["nom"])
Tri selon deux critères
Pour trier d'abord par ville croissante puis, à ville égale, par âge, la clé renvoie un couple : Python compare les couples dans l'ordre lexicographique.
sorted(t, key=lambda e: (e["ville"], e["age"]))
Pour un sens différent selon le critère (ville croissante, âge décroissant), on utilise la stabilité : le tri de Python ne change pas l'ordre relatif de deux éléments dont les clés sont égales. On trie donc d'abord selon le critère secondaire, puis selon le critère principal.
On veut trier une table t selon deux critères : d'abord par ville croissante, puis, à ville égale, par age décroissant. a) Écrire l'appel à sorted correspondant en…
On veut trier une table t selon deux critères : d'abord par ville croissante, puis, à ville égale, par age décroissant.
- a) Écrire l'appel à
sortedcorrespondant en utilisant une fonctionkeyrenvoyant un couple.
- b) Justifier que le tri de Python est stable et montrer comment l'utiliser pour obtenir le même résultat avec deux tris successifs. Préciser l'ordre des deux tris.
- c) Appliquer la méthode aux enregistrements (Lille, 16), (Nice, 17), (Lille, 18), (Nice, 15) et donner le résultat.
Fusionner des tables
Les données sont souvent réparties dans plusieurs tables liées par un champ commun (une clé), comme id_club ci-dessous.
La méthode efficace : transformer clubs en dictionnaire indexé par la clé, puis parcourir eleves une seule fois.
Deux tables : eleves avec les champs id, nom, id_club, et clubs avec les champs id_club, club, salle. a) Écrire une fonction fusion(eleves, clubs) qui renvoie une table…
Deux tables : eleves avec les champs id, nom, id_club, et clubs avec les champs id_club, club, salle.
- a) Écrire une fonction
fusion(eleves, clubs)qui renvoie une table dont chaque enregistrement contientnom,clubetsalle.
- b) Que devient un élève dont
id_clubn'existe pas dansclubs? Proposer un traitement.
- c) Donner la complexité de la fusion avec deux boucles imbriquées, puis expliquer comment l'améliorer.
Une table releves contient les champs station, date et temp (température en °C, lue comme chaîne dans le CSV) pour des stations météo françaises. a) Écrire une fonction…
Une table releves contient les champs station, date et temp (température en °C, lue comme chaîne dans le CSV) pour des stations météo françaises.
- a) Écrire une fonction qui convertit les températures en flottants et signale les valeurs manquantes (chaîne vide) en les écartant.
- b) Écrire une fonction qui renvoie un dictionnaire donnant la température moyenne par station.
- c) En déduire la station la plus chaude en moyenne. Préciser ce qui se passe en cas d'égalité avec votre code.
Une table emprunts (champs id_livre, id_lecteur, date) et une table livres (champs id_livre, titre, auteur) décrivent une médiathèque à Rennes. a) Écrire une fonction…
Une table emprunts (champs id_livre, id_lecteur, date) et une table livres (champs id_livre, titre, auteur) décrivent une médiathèque à Rennes.
- a) Écrire une fonction qui renvoie le titre du livre le plus emprunté.
- b) Écrire une fonction qui renvoie, pour chaque lecteur, la liste des titres empruntés.
- c) Identifier deux contrôles de cohérence entre les tables et écrire une fonction qui les vérifie.
Vers le début : pour ajouter la salle à chaque élève, on fusionne eleves et clubs grâce au champ commun id_club, après avoir indexé clubs dans un dictionnaire.
L'essentiel
-
Une table est un ensemble d'enregistrements ayant les mêmes champs (descripteurs) ; un fichier CSV la stocke en texte, avec un séparateur.
-
En Python, une table est une liste de dictionnaires ;
csv.DictReaderdans un blocwithla lit, et toutes les valeurs sont des chaînes à convertir. -
On sélectionne par compréhension
[e for e in t if critère]; on détecte doublons et incohérences en parcourant la table. -
sorted(t, key=...)trie selon une colonne ; une clé de type couple permet plusieurs critères ; le tri est stable. -
On fusionne deux tables en indexant l'une par la clé commune dans un dictionnaire : coût $n + m$ au lieu de $n \times m$.