Retour à la page d'accueilNSI · Première (sans spé maths) · Changer de matière
Commencer gratuitement
Première (sans spé maths) · NSI
Types construits et algorithmique en première NSI · Traitement de données en tables

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.

Un fichier CSV et la table correspondante : descripteurs, enregistrements et séparateur nom,ville,age Durand,Lille,17 Petit,Nice,16 fichier eleves.csv → nom ville age Durand Lille 17 Petit Nice 16 descripteurs en haut, un enregistrement par ligne

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
Entraîne-toi★☆☆Pas commencé
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
  1. a) Quel est le séparateur de champs ? Quels sont les descripteurs ?
  1. b) Combien d'enregistrements contient la table ?
  1. c) Représenter cette table sous forme d'une liste de dictionnaires en Python.
Résoudre

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.

Entraîne-toi★☆☆Pas commencé
É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.

Résoudre

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 @).

Entraîne-toi★☆☆Pas commencé
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.

  1. a) Écrire une compréhension qui renvoie la liste des enregistrements dont la ville est "Lille".
  1. b) Écrire une compréhension qui renvoie la liste des noms des élèves d'âge 16.
  1. c) Écrire une instruction qui ajoute l'enregistrement de Blanc, Brest, 17 ans.
Résoudre
Entraîne-toi★★☆Pas commencé
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²).

  1. a) Écrire une compréhension qui renvoie les villes de la région "Bretagne" de plus de 50 000 habitants.
  1. b) Écrire une fonction qui renvoie la moyenne des densités (population divisée par superficie) de chaque ville de la table.
  1. c) Trier la table par population décroissante avec sorted et une fonction key.
Résoudre
Entraîne-toi★★☆Pas commencé
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.

  1. a) Écrire une fonction doublons(table) qui renvoie la liste des adresses mail apparaissant plus d'une fois.
  1. b) Écrire une fonction coherente(table) qui renvoie True si tous les champs de chaque enregistrement sont non vides et si le mail contient le caractère @.
  1. c) Expliquer pourquoi l'utilisation d'un dictionnaire améliore l'efficacité de la recherche de doublons par rapport à deux boucles imbriquées.
Résoudre

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.

Entraîne-toi★★★Pas commencé
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.

  1. a) Écrire l'appel à sorted correspondant en utilisant une fonction key renvoyant un couple.
  1. 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.
  1. c) Appliquer la méthode aux enregistrements (Lille, 16), (Nice, 17), (Lille, 18), (Nice, 15) et donner le résultat.
Résoudre

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.

Deux tables reliées par le champ id_club pour produire une table fusionnée eleves clubs nom | id_club Léa | 2 Hugo | 1 id_club | club | salle 1 | échecs | B12 2 | théâtre | A03 id_club résultat : nom, club, salle

La méthode efficace : transformer clubs en dictionnaire indexé par la clé, puis parcourir eleves une seule fois.

Entraîne-toi★★☆Pas commencé
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.

  1. a) Écrire une fonction fusion(eleves, clubs) qui renvoie une table dont chaque enregistrement contient nom, club et salle.
  1. b) Que devient un élève dont id_club n'existe pas dans clubs ? Proposer un traitement.
  1. c) Donner la complexité de la fusion avec deux boucles imbriquées, puis expliquer comment l'améliorer.
Résoudre
Entraîne-toi★★★Pas commencé
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.

  1. a) Écrire une fonction qui convertit les températures en flottants et signale les valeurs manquantes (chaîne vide) en les écartant.
  1. b) Écrire une fonction qui renvoie un dictionnaire donnant la température moyenne par station.
  1. c) En déduire la station la plus chaude en moyenne. Préciser ce qui se passe en cas d'égalité avec votre code.
Résoudre
Entraîne-toi★★★Pas commencé
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.

  1. a) Écrire une fonction qui renvoie le titre du livre le plus emprunté.
  1. b) Écrire une fonction qui renvoie, pour chaque lecteur, la liste des titres empruntés.
  1. c) Identifier deux contrôles de cohérence entre les tables et écrire une fonction qui les vérifie.
Résoudre

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.DictReader dans un bloc with la 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$.

Voir tous les exercices de cette partie