Skip to content

Données en tables

Thème du programme

Données structurées et leur traitement

Objectifs de la séquence

Les élèves doivent être capables de :

  • comprendre la structure d'une table de données
  • identifier attributs, enregistrements et clés
  • manipuler une table en Python
  • filtrer et trier des données
  • comprendre et réaliser une fusion de tables

Structure d'une table de données

Notions

Une table est composée :

  • de colonnes appelées attributs
  • de lignes appelées enregistrements

Chaque attribut possède :

  • un nom
  • un domaine de valeurs

Une clé primaire est un attribut qui permet d'identifier de façon unique chaque enregistrement.


Exemple de table

id nom âge ville
1 Alice 17 Lyon
2 Hugo 16 Saint-Étienne
3 Lina 17 Lyon
4 Tom 16 Grenoble

Questions

  1. Combien la table contient-elle d'attributs ?
  2. Combien contient-elle d'enregistrements ?
  3. Quel attribut peut servir de clé primaire ?
  4. Peut-on avoir deux élèves avec le même nom ?

Représentation d'une table en Python

Une table peut être représentée par une liste de dictionnaires.

eleves = [
{"id":1, "nom":"Alice", "age":17, "ville":"Lyon"},
{"id":2, "nom":"Hugo", "age":16, "ville":"Saint-Étienne"},
{"id":3, "nom":"Lina", "age":17, "ville":"Lyon"},
{"id":4, "nom":"Tom", "age":16, "ville":"Grenoble"}
]

Activitées

rappels concernant les dictionnaires

rappels types construits : Dictionnaires

Exercice 1

La table étant sous la forme d'une liste de dictionnaires , proposez un script python qui permet d'afficher tous les noms des élèves. Soit :

Notes

Alice

Hugo

Lina

Tom

Une réponse ?
Aller encore un petit effort !
for e in eleves:
    print(e["nom"])

Exercice 2

La table étant sous la forme d'une liste de dictionnaires , proposez un script python qui permet d'afficher les élèves qui habitent à lyon soit :

Notes

{'id': 1, 'nom': 'Alice', 'age': 17, 'ville': 'Lyon'}

{'id': 3, 'nom': 'Lina', 'age': 17, 'ville': 'Lyon'}

Une réponse ?
Aller encore un petit effort !
for e in eleves:
    if e["ville"] == "Lyon":
        print(e)

Exercice 3

La table étant sous la forme d'une liste de dictionnaires , proposez un script python qui permet de compter les élèves de 16 ans. soit le résultat suivant :

Notes

2

Une réponse ?
Aller encore un petit effort !
c = 0

for e in eleves:
    if e["age"] == 16:
        c = c + 1

print(c)

Filtrer une table

Filtrer consiste à extraire certaines lignes d'une table.

Exemple

Créer une table contenant les élèves de Lyon.

Une réponse ?
Aller encore un petit effort !
lyon = []

for e in eleves:
    if e["ville"] == "Lyon":
        lyon.append(e)

print(lyon)

Exercice

Ecrire une fonction qui retourne les élèves d'une ville donnée

def eleves_ville(table, ville):
Exemple d'utilisation

Notes

print(eleves_ville(eleves, "Lyon"))

et le résultat attendu

Notes

[
{'id':1,'nom':'Alice','age':17,'ville':'Lyon'},
{'id':3,'nom':'Lina','age':17,'ville':'Lyon'}
]
Une réponse ?
Aller encore un petit effort !
def eleves_ville(table, ville):

    resultat = []

    for e in table:
        if e["ville"] == ville:
            resultat.append(e)

    return resultat

Trier une table

On peut trier une table selon un attribut.

Pour la suite de cette activité, nous utiliserons les fonctions python suivantes (clic droit "ouvrir dans un nouvel onglet"):

sorted

lambda x

Tri par âge

eleves_tries = sorted(eleves, key=lambda x: x["age"])

Tri par nom

eleves_tries = sorted(eleves, key=lambda x: x["nom"])

Tri décroissant

eleves_tries = sorted(eleves, key=lambda x: x["age"], reverse=True)

Exercices

Trier les élèves par ville

Le résultat attendu

Notes

Alice Lyon

Lina Lyon

Tom Grenoble

Hugo Saint-Étienne

Une réponse ?
Aller encore un petit effort !
sorted(eleves, key=lambda x: x["ville"])

Trier les élèves par âge décroissant

Une réponse ?
Aller encore un petit effort !
sorted(eleves, key=lambda x: x["age"], reverse=True)

Fusionner des tables

Pourquoi fusionner plusieurs tables ?

Pour éviter la répétition des données.

Exemple

Table élève

id_eleve nom classe
1 Alice 1A
2 Hugo 1B
3 Lina 1A

Table notes

id_eleve matière note
1 maths 15
1 NSI 18
2 maths 12
3 NSI 17

Objectif Obtenir une table fusionnée :

nom matière note
Alice maths 15
Alice NSI 18
Hugo maths 12
Lina NSI 17

Le principe

On relie les tables grâce à un attribut commun : la clé.

  • clé primaire : identifie une ligne

  • clé étrangère : référence une autre table

L'implémentation en python

eleves = [
{"id":1,"nom":"Alice","classe":"1A"},
{"id":2,"nom":"Hugo","classe":"1B"},
{"id":3,"nom":"Lina","classe":"1A"}
]

notes = [
{"id":1,"matiere":"maths","note":15},
{"id":1,"matiere":"NSI","note":18},
{"id":2,"matiere":"maths","note":12},
{"id":3,"matiere":"NSI","note":17}
]
Une fusion simple
for n in notes:
    for e in eleves:
        if e["id"] == n["id"]:
            print(e["nom"], n["matiere"], n["note"])

Construire une table fusionnée

fusion = []

for n in notes:
    for e in eleves:
        if e["id"] == n["id"]:

            ligne = {
                "nom": e["nom"],
                "matiere": n["matiere"],
                "note": n["note"]
            }

            fusion.append(ligne)

print(fusion)

Exercices

Exercice 1

Afficher toutes les notes de maths pour obtenir le résultat suivant :

Notes

{'id':1,'matiere':'maths','note':15}

{'id':2,'matiere':'maths','note':12}

Une réponse ?
Aller encore un petit effort !
for n in notes:
if n["matiere"] == "maths":
    print(n)

Exercice 2

Afficher toutes les notes d'Alice pour obtenir le résultat suivant :

Notes

{'id':1,'matiere':'maths','note':15}

{'id':1,'matiere':'NSI','note':18}

Une réponse ?
Aller encore un petit effort !
for n in notes:
    if n["id"] == 1:
        print(n)

Exercice 3

Créer une table fusionnée contenant :

Notes

nom

classe

matière

note

sous la forme :

Notes

[
{'nom':'Alice','classe':'1A','matiere':'maths','note':15},
{'nom':'Alice','classe':'1A','matiere':'NSI','note':18},
{'nom':'Hugo','classe':'1B','matiere':'maths','note':12},
{'nom':'Lina','classe':'1A','matiere':'NSI','note':17}
]
Une réponse ?
Aller encore un petit effort !
fusion = []

for n in notes:
    for e in eleves:

        if e["id"] == n["id"]:

            ligne = {
                "nom": e["nom"],
                "classe": e["classe"],
                "matiere": n["matiere"],
                "note": n["note"]
            }

            fusion.append(ligne)

print(fusion)

Attention, l'activité n'est pas terminée !!

Ouvrez le menu de gauche pour accéder au prochain chapitre