Contexte

Dans l'exemple donné ci-dessous, la liste des élèves a été construite dans un ordre aléatoire.

En réalité, les tables de données sont construites dans un ordre temporel : les données sont ajoutées au fur et à mesure des saisies.

Concrètement dans une base de données, à chaque fois qu'on ajoute une nouvelle ligne (ici un élève), elle est ajoutée en fin de table.

Cela n'a pas d'importance d'avoir une saisie ordonnée puisque des fonctions performates de tri existent, sans compter que le tri peut se faire suivants différents critères.

Trier les élèves sur les notes d'Anglais

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

- Tester le programme suivant :

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 selon une colonnes
#table : nom de la table
#attributs : nom de la colonne à trier
#decroit : drapeau ordre décroissant du classement, si omis False
def tri(table, attribut, decroit=False):
    def critere(ligne):
        return ligne[attribut]
    return sorted(table, key=critere, reverse=decroit)

#======Programme principal=============================
#---essai fonction tri()
resu = tri(TableEleve, 'Anglais')
print(resu)

a- Vérifier que les élèves ont été classés en ordre croissant en fonction de leur note d'anglais.

b- Tester de nouveau le programme en changeant la ligne 18 par :

resu = tri(TableEleve, 'Anglais', True)

c- Vérifier que les élèves ont été classés en ordre décroissant en fonction de leur note d'anglais.

Remarque

Vous aurez remarqué que le paramètre decroit a été omis dans le premier tri, mais qu'il a été défini par défaut comme étant false dans la fonction :

def tri(table, attribut, decroit=False):

L'écriture decroit=False signifie que la valeur par défaut de decroit est False.

Trier les élèves sur les notes de Maths

d- Modifier la ligne 18 pour effectuer un tri sur les notes de 'Maths' en ordre croissant.

e- Expliquer pourquoi les élèves ne sont pas triés correctement en ordre croissant ?

f- Apporter les modifications au programme ci-dessus afin que le tri des élèves en ordre croissant sur les notes de Maths se fasse correctement.

Convertir le type de variable d'un attribut

La fonction suivante - qui s'inspire de la fonction projection() vue dans l'activité précédente - a pour objectif de convertir les valeurs d'un attribut donné en valeur numérique :

#************************************************************************
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 conversion type attribut
#table : nom de la table
#liste_attributs : nom des colonnes à convertir
def conversion_type(table,liste_attributs):
    ta=[ ]
    for ligne in table:
        for cle in liste_attributs:
            ...
        ta.append(ligne)
    return ta

#======Programme principal=============================
#---essai fonction projection() sur l'attribut 'Info'
resu = conversion_type(TableEleve, ['Info'])
print(resu)

La ligne 15 est à trouver pour permettre de convertir ligne[cle] en float.

- Tester le programme afin de vérifier que les notes d'Info sont bien des nombres :

resuConvFloatInfo

g- Modifier le programme du début de cette activité afin de permettre de trier correctement les élèves suivant les notes de telle ou telle matière.