Vous êtes sur la page 1sur 3

Aidons le Choixpeau magique

A l'entrée à l'école de Poudlard, le Choixpeau magique répartit les élèves dans les différentes
maisons (Gryffondor, Serpentard, Serdaigle, Poufsouffle) en fonction de leur courage, leur loyauté,
leur sagesse et leur malice.

Le Choixpeau magique dispose d'un fichier CSV dans lequel sont répértoriés les données d'un
échantillon d'élèves. Voici les 6 premières lignes de ce fichier.

Nom Courage Loyauté Sagesse Malice Maison


Adrian 9 4 7 10 Serpentard
Andrew 9 3 4 7 Gryffondor
Angelina 10 6 5 9 Gryffondor
Anthony 2 8 8 3 Serdaigle
Arthur 10 4 2 5 Gryffondor

Et voici les élèves que le Choixpeau magique souhaite orienter :

Nom Courage Loyauté Sagesse Malice


Hermione 8 6 6 6
Drago 6 6 5 8
Cho 7 6 9 6
Cedric 7 10 2 6

L'objectif de cet exercice est d'aider le Choixpeau magique à déterminer la


maison des nouveaux élèves.
Partie 1 : Modéliser un élève

On décide de modéliser chaque élève par un dictionnaire avec les données à disposition. Par
exemple :

adrian = {"nom":"Adrian","courage":9,"loyauté":4,"sagesse":7,"malice":10,"maison":"Serpentard"}
hermione = {"nom":"Hermione","courage":8,"loyauté":6,"sagesse":6,"malice":6}

1. Donner la modélisation de l'élève Anthony.


2. On décide d'utiliser la distance de Manhattan pour calculer la distance entre deux élèves,
c'est à dire : distance (eleve1,eleve2)=|c1-c2| + |l1-l2| + |s1-s2| + |m1-m2|
a. Avec cette formule, vérifier que la distance entre Hermione et Adrian est bien égale à 8.
b. Quelle est la distance entre Arthur et Drago ?
c. Ecrire le code d'une fonction distance qui prend deux élèves en paramètre et qui renvoie la
distance entre ces deux élèves. Préciser les spécifications et donner un test.
Partie 2 : Charger les données en table

Voici le code d'une fonction qui permet de récupérer les données des élèves d'un fichier CSV pour
les stocker dans une liste, à adapter en fonction de votre interface :

1 def charger_table(nom_fichier):
2 # fonction qui charge une liste d'élèves à partir d'un fichier CSV
3 # Paramètre: le nom d'un fichier csv
4 # Résultat: la liste des élèves
5 table=[]
6 with open(nom_fichier,'r',
7 newline="",
8 encoding="utf-8") as csvfile:
9 eleve_reader = csv.reader(csvfile, delimiter=";")
10 eleve_reader._next_()
11 for eleve in eleve_reader:
12
13 table.append({"nom":eleve[0],"courage":int(eleve[1]),"loyauté":int(eleve[2]),"sagesse":int(eleve
14 [3]),"malice":int(eleve[4]),"maison":eleve[5]})
15 return table

L'instruction suivante permet de charger les informations dans une variable poudlard à partir d'un
fichier choixpeauMagique.csv qui se trouve dans le répertoire courant.

poudlard = charger_table(" ./choixpeauMagique.csv ")


1. Dans le code de la fonction charger_table, à la ligne 13, quel est le type de la variable
eleve[0] ?
2. Quel est le type de int(eleve[1]) ? Pourquoi a-t-on besoin de la fonction int() ici ?
3. Quel est le type de la variable poudlard ?

Partie 3 :Trouver la maison majoritaire

On souhaite écrire le code d'une fonction qui prend en paramètre une liste d'élèves et qui renvoie la
maison la plus représentée dans cette liste. Pour cela, on propose d'utiliser une fonction auxiliaire
dont le code est le suivant :

1 def frequence_des_maisons(table):
2 #Paramètre : une liste d'élèves, chaque élèment étant modélisé par un dictionnaire
3 #Résultat : un dictionnaire dont les clés sont les maisons et les valeurs, le nombre de fois où cette maison
4 #apparaît
5 frequences={}
6 for eleve in table:
7 maison = eleve["maison"]
8 if maison in frequences.keys():
9 frequences[maison] = frequences[maison] + 1
10 else:
11 frequences[maison]=1
12 return frequences

assert frequences_des_maisons(poudlard) = = {'Serpentard':12,'Gryffondor':17,'Serdaigle':11,'Poufsouffle':10}

1. Quelle est la signification du nombre 12 qui apparaît à la ligne 11 ?


2. Ecrire le code de la fonction maison_majoritaire qui prend une liste d'élèves en paramètre et
qui renvoie le nom de la maison la plus representée. Ne pas oublier les spécifications et au
moins un test.
Partie 4 : Sept plus proches voisins

1. compléter la formulation de l'algorithme suivant.


Données : table : une liste d'élèves
nouveau : un nouvel élève qui n'a pas encore de maison
Résultats : les 7 plus proches voisins du nouveau.
Algorithme :... (à faire)

2. Implémenter cet algorithme en Python.

Partie 5 : Attribuer une maison

Le Choixpeau Magique décide d'utiliser un algorithme de prédiction pour choisir la maison qui sera
attribuée aux nouveaux élèves. Voici cet algorithme :

Données : table est une liste d'élèves


un nouvel élève qui n'a pas encore de maison
Résultats : la maison du nouvel élève.
Algorithme :
1. Trouver dans la table les 7 plus proches voisins du nouvel élève.
2. Parmi ces proches_voisins, trouver la maison majoritaire.
3. Renvoyer la maison_majoritaire.

Enfin, implémenter cet algorithme en Python.

Vous aimerez peut-être aussi