5.2 Trier des données⚓︎
Nous reprenons notre fichier de joueurs de rugby du Top14. : top14.csv
import csv
f = open('top14.csv', "r", encoding = 'utf-8')
donnees = csv.DictReader(f)
joueurs = []
for ligne in donnees:
joueurs.append(dict(ligne))
f.close()
1. Créer une fonction filtre⚓︎
Question 1
Créer une fonction joueursEquipe
qui renvoie une liste contenant les fiches de tous les joueurs de l'équipe equipe
passée en paramètre.
Exemple d'utilisation :
>>> joueursEquipe('Bordeaux')
[{'Equipe': 'Bordeaux', 'Nom': 'Jefferson POIROT', 'Poste': 'Pilier', 'Date de naissance': '01/11/1992', 'Taille': '181', 'Poids': '117'}, {'Equipe': 'Bordeaux', 'Nom': 'Lasha TABIDZE', 'Poste': 'Pilier', 'Date de naissance': '04/07/1997', 'Taille': '185', 'Poids': '117'}, {'Equipe': 'Bordeaux', 'Nom': 'Laurent DEL.....
Correction
def joueursEquipe(equipe):
return [player for player in joueurs if player['Equipe'] == equipe]
Question 2
Définir de la même manière une fonction joueursPoste
qui prend une chaîne de caractères poste
et qui renvoie la liste des fiches des joueurs jouant à ce poste.
Exemple d'utilisation :
>>> joueursPoste("Talonneur")
[{'Equipe': 'Agen', 'Nom': 'Clément MARTINEZ', 'Poste': 'Talonneur', 'Date de naissance': '14/03/1996', 'Taille': '181', 'Poids': '105'}, {'Equipe': 'Agen', 'Nom': 'Marc BARTHOMEUF', 'Poste': 'T...
Correction
def joueursPoste(poste):
return [player for player in joueurs if player['Poste'] == poste]
2. Utilisation d'une fonction de tri⚓︎
2.1 Le problème⚓︎
Comment classer les joueurs suivant leur taille ?
La fonction sorted(liste)
est efficace sur les listes : elle renvoie une nouvelle liste triée dans l'ordre croissant.
>>> mylist = [4,2,8,6]
>>> mynewlist = sorted(mylist)
>>> print(mynewlist)
[2, 4, 6, 8]
Mais comment trier un dictionnaire ?
>>> test = sorted(joueurs)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-de081d14a3da> in <module>
----> 1 test = sorted(joueurs)
TypeError: '<' not supported between instances of 'dict' and 'dict'
Il est normal que cette tentative échoue : un dictionnaire possède plusieurs clés différentes. Ici, plusieurs clés peuvent être des critères de tri : la taille, le poids.
Nous allons donc utiliser la même stratégie que celle utilisée pour le problème du sac à dos.
2.2 Un exemple de tri de dictionnaire⚓︎
Simpsons = [{"Prenom" : "Bart", "age estimé": "10"},
{"Prenom" : "Lisa", "age estimé": "8"},
{"Prenom" : "Maggie", "age estimé": "1"},
{"Prenom" : "Homer", "age estimé": "38"},
{"Prenom" : "Marge", "age estimé": "37"}]
def age(personnage):
return int(personnage["age estimé"])
>>> age(Simpsons[0])
10
La création de cette fonction age
va nous permettre de spécifier une clé de tri, par le paramètre key
:
Tri d'un dictionnaire
>>> triSimpsons = sorted(Simpsons, key=age)
>>> triSimpsons
[{'Prenom': 'Maggie', 'age estimé': '1'},
{'Prenom': 'Lisa', 'age estimé': '8'},
{'Prenom': 'Bart', 'age estimé': '10'},
{'Prenom': 'Marge', 'age estimé': '37'},
{'Prenom': 'Homer', 'age estimé': '38'}]
On peut aussi inverser l'ordre de tri :
>>> triSimpsons = sorted(Simpsons, key=age, reverse=True)
>>> triSimpsons
[{'Prenom': 'Homer', 'age estimé': '38'},
{'Prenom': 'Marge', 'age estimé': '37'},
{'Prenom': 'Bart', 'age estimé': '10'},
{'Prenom': 'Lisa', 'age estimé': '8'},
{'Prenom': 'Maggie', 'age estimé': '1'}]
Question 3
Trier les joueurs du Top14 par taille.
Correction
def taillePlayer(player) :
return int(player['Taille'])
joueurs_taille_croissant = sorted(joueurs, key=taillePlayer)
Question 4
Trier les joueurs du Top14 par poids.
Correction
def poidsPlayer(player) :
return int(player['Poids'])
joueurs_poids_croissant = sorted(joueurs, key=poidsPlayer)
Question 5
Trier les joueurs de Bordeaux suivant leur Indice de Masse Corporelle (IMC )
Correction
def IMC(player):
masse = int(player['Poids'])
taille_m = int(player['Taille']) / 100
return masse / taille_m**2
joueursUBB = [player for player in joueurs if player['Equipe'] == 'Bordeaux']
joueursUBB_tri = sorted(joueursUBB, key=IMC)
3. Recherche des joueurs de profil physique similaire⚓︎
3.1 Distance entre deux joueurs⚓︎
Question 6
Construire une fonction distance
qui renvoie la somme des carrés des différences de tailles et de poids entre deux joueurs joueur1
et joueur2
, passés en paramètres.
Cette fonction nous permettra d'estimer la différence morphologique entre deux joueurs.
Exemple d'utilisation :
>>> distance(joueurs[23], joueurs[31])
244
Vérification :
>>> joueurs[23]
{'Equipe': 'Agen', 'Nom': 'Alban CONDUCHÉ', 'Poste': 'Centre', 'Date de naissance': '29/10/1996', 'Taille': '190', 'Poids': '102'}
>>> joueurs[31]
{'Equipe': 'Agen', 'Nom': 'JJ TAULAGI', 'Poste': 'Arrière', 'Date de naissance': '18/06/1993', 'Taille': '180', 'Poids': '90'}
\((102-90)^2+(190-180)^2=244\)
Correction
def distance(joueur1,joueur2):
p1 = int(joueur1['Poids'])
p2 = int(joueur2['Poids'])
t1 = int(joueur1['Taille'])
t2 = int(joueur2['Taille'])
return (p1 - p2)**2 + (t1 - t2)**2
3.2 Distance des joueurs avec Baptiste Serin⚓︎
Retrouvons d'abord le numéro de Baptiste Serin dans notre classement de joueurs :
>>> for k in range(len(joueurs)) :
if joueurs[k]['Nom'] == 'Baptiste SERIN' :
print(k)
530
>>> joueurs[530]
{'Equipe': 'Toulon',
'Nom': 'Baptiste SERIN',
'Poste': 'Mêlée',
'Date de naissance': '20/06/1994',
'Taille': '180',
'Poids': '79'}
Baptiste SERIN est donc le joueur numéro 530.
Question 7
Créer une fonction distanceSerin
qui prend en paramètre un joueur et qui renvoie sa différence avec Baptiste Serin.
Exemple d'utilisation :
>>> distanceSerin(joueurs[18])
745
Correction
def distanceSerin(joueur):
return distance(joueurs[530], joueur)
Question 8
Classer l'ensemble des joueurs du Top14 suivant leur différence morphologique avec Baptiste Serin (du plus proche au plus éloigné). Afficher le nom des 10 premiers joueurs.