Aller au contenu

Exercices d'entraînement
Tris

Ces exercices doivent être utilisés pour vous entraîner à programmer. Ils sont généralement accompagnés d'aide et de leur solution pour vous permettre de progresser.

Avant de vous précipiter sur ces solutions dès la première difficulté, n'oubliez pas les conseils suivants :

  • Avez-vous bien fait un schéma au brouillon pour visualiser le problème posé ?
  • Avez-vous essayé de rédiger un algorithme en français, avec vos propres mots, avant de vous lancer dans la programmation sur machine ?
  • Avez-vous utilisé des affichages intermédiaires, des print(), pour visualiser au fur et à mesure le contenu des variables ?
  • Avez-vous testé le programme avec les propositions de tests donnés dans l'exercice ?
  • Avez-vous testé le programme avec de nouveaux tests, différents de ceux proposés ?

Attention

  • Ne pas oublier de sauvegarder les fichiers dans le répertoire [NSI_Tables_Donnees].
  • Ne pas oublier d'importer le module fonctions_csv.
  • Ne pas oublier d'importer les fichiers CSV en tableau de dictionnaires pour pouvoir utiliser les fonctions...

ProgC02.61

Le programme à définir dans cet exercice est à appliquer uniquement à la table de données issue du fichier personnes.csv.

Rédigez un programme qui permette d'obtenir la table nommée table_personnes2 qui correspond au tri de la table table_personnes selon l'ordre croissant des années de naissance puis l'ordre croissant des noms de famille.
Projetez cette table uniquement sur les noms et prénoms des personnes puis affichez cette table dans la console dictionnaire par dictionnaire.

Affichage à obtenir
{'nom': 'Patamob', 'prenom': 'Alphonse'},
{'nom': 'Verse', 'prenom': 'Alain'},
{'nom': 'Ainé', 'prenom': 'Ali'},
{'nom': 'Etpan', 'prenom': 'Ahmed'},
{'nom': 'Térieur', 'prenom': 'Alex'},
{'nom': 'Ficulté', 'prenom': 'Andy'},
{'nom': 'Dajeun', 'prenom': 'Bruno'},
{'nom': 'Boréal', 'prenom': 'Aurore'},
{'nom': 'Gemlamorte', 'prenom': 'Adèle'},
{'nom': 'Nor', 'prenom': 'Paul'},
{'nom': 'Térieur', 'prenom': 'Alain'},
{'nom': 'Hiple', 'prenom': 'Candice'},
{'nom': 'Labrosse', 'prenom': 'Adam'},
{'nom': 'Proviste', 'prenom': 'Alain'},
{'nom': 'Rectdustade', 'prenom': 'Andy'},
{'nom': 'Auboisdormant', 'prenom': 'Abel'},
{'nom': 'Bistraux', 'prenom': 'Alonzo'},
{'nom': 'Ception', 'prenom': 'Alex'},
{'nom': 'Dejeu', 'prenom': 'Bernadette'},
{'nom': 'Gator', 'prenom': 'Ali'},
{'nom': 'Verserre', 'prenom': 'Annie'}
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from fonctions_csv import *

def Nom(dico):
    return dico["nom"]

def Annee(dico):
    return dico["annee_naissance"]

##----- Programme principal -----##
table_personnes = importe_csv('personnes.csv')

table_personnes2 = sorted(table_personnes, key=Nom)

table_personnes2.sort(key=Annee)

table_personnes2 = projection(table_personnes2, ['nom', 'prenom'])

for dico in table_personnes2:
    print(dico)

ProgC02.62

On considère les notes de quatre élèves obtenus lors de trois contrôles :

1
2
3
4
notes = [ {"Prenom": "Zoé", "C1": 8, "C2": 12, "C3": 9}, 
          {"Prenom": "Laurent", "C1": 2, "C2": 18, "C3": 15}, 
          {"Prenom": "Brahim", "C1": 14, "C2": 13, "C3": 17}, 
          {"Prenom": "Julie", "C1": 2, "C2": 11, "C3": 12}]
  1. Définissez le tableau notes_triees qui correspond au tableau notes trié par ordre croissant des résultats du premier contrôle.

    Résultat à obtenir

    >>> notes_triees
    [{'Prenom': 'Laurent', 'C1': 2, 'C2': 18, 'C3': 15},
     {'Prenom': 'Julie', 'C1': 2, 'C2': 11, 'C3': 12},
     {'Prenom': 'Zoé', 'C1': 8, 'C2': 12, 'C3': 9},
     {'Prenom': 'Brahim', 'C1': 14, 'C2': 13, 'C3': 17}]
    
    Une solution

    On définit une fonction C1() qui va servir de critère de tri à la fonction sorted() : le tri n'est pas en place...

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    def C1(dico):
        return dico["C1"]
    
    ##----- Programme principal -----##
    notes = [ {"Prenom": "Zoé", "C1": 8, "C2": 12, "C3": 9},
              {"Prenom": "Laurent", "C1": 2, "C2": 18, "C3": 15},
              {"Prenom": "Brahim", "C1": 14, "C2": 13, "C3": 17},
              {"Prenom": "Julie", "C1": 2, "C2": 11, "C3": 12}]
    
    notes_triees = sorted(notes, key=C1)
    

  2. Définissez le tableau notes_triees2 qui correspond au tableau notes trié selon les résultats du premier contrôle et par ordre alphabétique de prénom.

    Résultat à obtenir

    >>> notes_triees2
    [{'Prenom': 'Julie', 'C1': 2, 'C2': 11, 'C3': 12},
     {'Prenom': 'Laurent', 'C1': 2, 'C2': 18, 'C3': 15},
     {'Prenom': 'Zoé', 'C1': 8, 'C2': 12, 'C3': 9},
     {'Prenom': 'Brahim', 'C1': 14, 'C2': 13, 'C3': 17}]
    
    Une solution

    On définit une fonction C1_prenom() qui va servir de critère de tri à la fonction sorted() : le tri n'est pas en place...

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    def C1_prenom(dico):
        return dico["C1"], dico["Prenom"]
    
    ##----- Programme principal -----##
    notes = [ {"Prenom": "Zoé", "C1": 8, "C2": 12, "C3": 9},
              {"Prenom": "Laurent", "C1": 2, "C2": 18, "C3": 15},
              {"Prenom": "Brahim", "C1": 14, "C2": 13, "C3": 17},
              {"Prenom": "Julie", "C1": 2, "C2": 11, "C3": 12}]
    
    notes_triees2 = sorted(notes, key=C1_prenom)
    

    Remarque

    Lorsque le tri est effectué « en place » à l'aide de la méthode .sort(), on peut conserver la fonction C1() puis créer la fonction prenom() renvoyant comme critère la valeur de la clé 'Prenom' d'un dictionnaire :

    4
    5
    def prenom(dico):
        return dico["Prenom"]
    
    En appliquant successivement le tri à la table notes, d'abord avec le critère de la fonction prenom(), puis avec le critère de la fonction C1(), on obtient le même résultat que ci-dessus (en modifiant la table notes plutôt qu'en créant une nouvelle table) :
    1
    2
    notes.sort(key=prenom)
    notes.sort(key=C1)
    

    Puis, dans la console :

    >>> notes
    [{'Prenom': 'Julie', 'C1': 2, 'C2': 11, 'C3': 12},
     {'Prenom': 'Laurent', 'C1': 2, 'C2': 18, 'C3': 15},
     {'Prenom': 'Zoé', 'C1': 8, 'C2': 12, 'C3': 9},
     {'Prenom': 'Brahim', 'C1': 14, 'C2': 13, 'C3': 17}]    
    

    L'ordre du tri précédent est conservé car le tri appliqué par Python est dit stable :
    « si deux éléments sont égaux vis-à-vis du tri appliqué, alors ils restent dans l'ordre dans lequel ils étaient au départ. »

    Vous pouvez lire, par exemple, ce paragraphe de wikipedia pour en savoir plus sur cette notion.

ProgC02.63

On reprend le tableau de notes :

1
2
3
4
notes = [ {"Prenom": "Zoé", "C1": 8, "C2": 12, "C3": 9}, 
          {"Prenom": "Laurent", "C1": 2, "C2": 18, "C3": 15}, 
          {"Prenom": "Brahim", "C1": 14, "C2": 13, "C3": 17}, 
          {"Prenom": "Julie", "C1": 2, "C2": 11, "C3": 12}]

Rédigez un programme qui permette d'obtenir la table de notes nommées notes2 et triée par ordre croissant selon la moyenne aux trois contrôles.

Résultat à obtenir

>>> notes2
[{'Prenom': 'Julie', 'C1': 2, 'C2': 11, 'C3': 12},
 {'Prenom': 'Zoé', 'C1': 8, 'C2': 12, 'C3': 9},
 {'Prenom': 'Laurent', 'C1': 2, 'C2': 18, 'C3': 15},
 {'Prenom': 'Brahim', 'C1': 14, 'C2': 13, 'C3': 17}]
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def moyenne(dico):
    return (dico["C1"]+dico["C2"]+dico["C3"])/3

##----- Programme principal -----##
notes = [ {"Prenom": "Zoé", "C1": 8, "C2": 12, "C3": 9},
          {"Prenom": "Laurent", "C1": 2, "C2": 18, "C3": 15},
          {"Prenom": "Brahim", "C1": 14, "C2": 13, "C3": 17},
          {"Prenom": "Julie", "C1": 2, "C2": 11, "C3": 12}]

notes2 = sorted(notes, key=moyenne)