Contexte

En python, il existe des instructions de recherche de données dans un tableau ou un  dictionnaire. Mais l'idée de cette activité, est de vous présenter des fonctions de recherche similaires à ce qui est utilisé dans des base de données. En effet, comme vu en SNT en seconde, une base de données est constituée de plusieurs tables de données.

Or une table de données peut tout à fait être réprésentée par une liste de dictionnaire, structure de donnée déjà vue.

Dans une liste de dictionnaire on va mettre en évidence deux types de recherche :

- la recherche des données en ligne

- la recherche des données en colonne

Rechercher des données en ligne

L'objectif est de rechercher des données en fonction de critère(s) afin d'extraire les lignes correspondantes : selectionLignePrincipe

Afin de simplifier l'activité, le tableau TableEleve est donné directement sans avoir à l'importer du fichier CSV.

Examinons dans un premier temps la fonction select() avec une écriture classique :

TableEleve = [{'Nom': 'Joe', 'Anglais': '17', 'Info': '18', 'Maths': '16'},
            {'Nom': 'Zoé', 'Anglais': '15', 'Info': '17', 'Maths': '19'},
            {'Nom': 'Max', 'Anglais': '19', 'Info': '13', 'Maths': '14'},
            {'Nom': 'Jules', 'Anglais': '11', 'Info': '13', 'Maths': '7'}]
#=============Définition des fonctions=================
#écriture avec boucle
#table : table de dictionnaire
#critere : critère de recherche
def select(table,critere):
    ta=[ ]
    for ligne in table:
        if eval(critere):
            ta.append(ligne)
    return ta

#======Programme principal=============================
#---essai fonction select()
resu = select(TableEleve, "eval(ligne['Maths']) > 16")
print(resu)

- Tester le code afin de vérifier que c'est bien Zoé qui est trouvé.

Vous remarquerez que le critère est écrit dans une chaîne de caractères et qu'une fois la fonction appelée, la ligne 12 de la fonction devient :

def select(table,critere):
    ta=[ ]
    for ligne in table:
        if ligne['Maths'] > 16:
            ta.append(ligne)
    return ta

C'est la fonction eval() qui permet de convertir une chaine de caractère en du code python. Il faut cependant être vigilant : la chaîne de caractères doit bien correspondre à du code python sans erreur !

Avec une notation en compréhension de cette même fonction cela donne :

#écriture condensée
def select(table,critere):
    return [ligne for ligne in table if eval(critere)]

Ce qui s'explique par :

selectCompreExplic

Construire un tableau (couleur orange) avec pour chaque élément la variable ligne, telle que :

- ligne est issue de table grace à la boucle For ... In ... (couleur verte)

- le critere doit être vrai : ici, la valeur de la clé info est scrictement supérieur à 16

Exercices

a- Changer le contenu de la fonction avec une notation en compréhension.

b- Modifier le critère afin de trouver les élèves qui ont une note en maths supérieure à 15 et vérifier que vous obtenez bien Joe et Zoé.

c- Modifier le critère afin de trouver les élèves qui ont eu 13 en Info.

d- Modifier le critère afin de trouver les élèves qui ont eu plus que 15 en Maths et plus que 15 en Anglais.

Rechercher des données en colonne

L'objectif est de rechercher des données en fonction de critère(s) afin d'extraire les colonnes correspondantes :

selectionColonnePrincipe

-  Tester le code suivant avec la fonction projection():

TableEleve = [{'Nom': 'Joe', 'Anglais': '17', 'Info': '18', 'Maths': '16'},
            {'Nom': 'Zoé', 'Anglais': '15', 'Info': '17', 'Maths': '19'},
            {'Nom': 'Max', 'Anglais': '19', 'Info': '13', 'Maths': '14'},
            {'Nom': 'Jules', 'Anglais': '11', 'Info': '13', 'Maths': '7'}]

#=============Définition des fonctions=================
#------Fonction sélection de colonnes
#table : nom de la table
#liste_attributs : nom des colonnes à sélectionner
#écriture classique
def projection(table,liste_attributs):
    ta=[ ]
    for ligne in table:
li={} for cle in ligne: if (cle in liste_attributs): li[cle] = ligne[cle] ta.append(li) return ta #======Programme principal============================= #---essai fonction projection() resu = projection(TableEleve, ['Nom', 'Info']) print(resu)

Vous devez obtenir une liste des élèves qu'avec les notes de Info.

Avec une notation en compréhension de la fonction projection, cela donne :

#écriture condensée
def projection(table,liste_attributs):
    return [ { cle:ligne[cle] for cle in ligne if cle in liste_attributs } for ligne in table ]

Exercices

e- Changer le contenu de la fonction avec une notation en compréhension.

f- Modifier liste_attributs afin de sélectionner les notes d'Anglais et Maths de tous les élèves avec leur nom.

g- Cet exercice consiste à utiliser les fonctions select() et projection() dans le même script :

Chercher le nom, la note d'anglais et d'informatique des élèves qui ont leur note d'anglais supérieure à 14 et leur note d'informatique qui est inférieure à 17,5.