Aller au contenu

5.2 Trier des données⚓︎

image

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.

\[d = (p_1-p_2)^2 + (t_1-t_2)^2\]

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.