Trier des données⚓︎
Nous reprenons notre fichier de joueurs de rugby du Top14.
🔽 Télécharger le notebook de cours correspondant ici
import csv
f = open('data/top14.csv', "r", encoding = 'utf-8')
donnees = csv.DictReader(f)
joueurs = []
for ligne in donnees:
joueurs.append(dict(ligne))
f.close()
Créer une fonction filtre⚓︎
L'objectif est de créer une fonction joueursEquipe(equipe)
qui renvoie une liste contentant tous les joueurs de l'équipe equipe
.
Le paramètre equipe
sera donnée sous forme de chaîne de caractères.
La valeur renvoyée sera de type liste de dictionnaire
.
réponse
def joueursEquipe(equipe):
lst_joueurs = []
for j in joueurs :
if j['Equipe'] == equipe :
lst_joueurs.append(j)
return lst_joueurs
assert len(joueursEquipe("Bordeaux")) == 37
❓ Définir de la même manière une fonction joueursPoste(poste)
qui renvoie une liste contentant tous les joueurs occupant le poste
. Le paramètre poste
sera donnée sous forme de chaîne de caractères.
La valeur renvoyée sera de type liste de dictionnaire
.
réponse
def joueursPoste(poste):
lst_joueurs = []
for j in joueurs :
if j['Poste'] == poste :
lst_joueurs.append(j)
return lst_joueurs
joueursPoste('Mêlée')
Utilisation d'une fonction de tri⚓︎
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]
tri en place ou non
La fonction sort()
est un tri dit en place. Elle modifie la liste elle-même (et renvoie None pour éviter les confusions). Contrairement à la fonction sorted()
qui créée une nouvelle liste et laisse la liste passée en paramètre non triée.
Source : doc python
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'
La tentative de tri sur un dictionnaire provoque une erreur. Un dictionnaire possède plusieurs clés différentes. Ici, plusieurs clés peuvent être des critères de tri : la taille, le poids.
Un exemple de tri de dictionnaire⚓︎
Prenons un nouveau jeu de données, contenant les informations sur la série Simpson.
Simpsons est de type Liste de dictionnaires
.
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"}]
age
permettant de renvoyer l'age estimé d'un personnage passé en paramètre.
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
de la fonction sorted
(voir doc Python ) :
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'}]
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'}]
❓ Trier les joueurs du top14 par taille.
réponse
```python
def taillePlayer(player) :
return int(player['Taille'])
joueurs_taille_croissant = sorted(joueurs, key = taillePlayer)
```
❓ Trier les joueurs du top14 par poids.
réponse
```python
def poidsPlayer(player) :
return int(player['Poids'])
joueurs_poids_croissant = sorted(joueurs, key = poidsPlayer)
```
❓ Trier les joueurs de Bordeaux suivant leur Indice de Masse Corporelle (IMC )
réponse
```python
def IMC(player):
masse = int(player['Poids'])
taille_m = int(player['Taille']) / 100
return masse / taille_m**2
joueursUBB = [k for k in joueurs if k['Equipe'] == 'Bordeaux']
joueursUBB_tri = sorted(joueursUBB, key = IMC)
```
Recherche des joueurs de profil physique similaire⚓︎
(Approche par Algorithme des plus proches voisins, knn)
Distance entre deux joueurs⚓︎
Construire une fonction distance(joueur1,joueur2)
qui renvoie la somme des carrés des différences de tailles et de poids entre les joueurs joueur1
et joueur2
:
$$ d = (p_1-p_2)^2 + (t_1-t_2)^2$$
réponse
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
Distance des joueurs avec Baptiste Serin⚓︎
Retrouvons d'abord le numéro de Baptiste Serin dans notre classement de joueurs :
réponse
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'}
Nous pouvons maintenant classer les joueurs suivant leur distance morphologique à Baptiste SERIN :
réponse
def distanceSerin(joueur2):
return distance(joueurs[530],joueur2)
distanceSerin(joueurs[530])
>>> 0
joueurs_VS_Serin = sorted(joueurs, key = distanceSerin)
joueurs_VS_Serin