Tête de série⚓︎
L'organisateur d'un tournoi sportif souhaite déterminer le nom du joueur participant le mieux classé dans le classement international.
Les classements des joueurs sont des entiers tous distincts et compris entre 1
et len(classement)
.
Il connait donc le nom des participants au tournoi, donné sous forme d'une liste, ainsi que le classement, donné sous forme d'un dictionnaire.
Par exemple :
participants = ['Stefanos', 'Rafael', 'David', 'Novak']
classement = {'Novak': 1, 'Daniil': 2, 'Alexander': 3, 'Stefanos': 4, 'Rafael': 5}
Comme on peut le voir dans l'exemple :
- tous les joueurs classés ne sont pas obligatoirement inscrits au tournoi (ici
Daniil
etAlexander
ne participent pas) - certains participants au tournoi, invités d'honneur, n'ont pas de classement (
David
ici)... On considèrera donc qu'ils sont moins bien classés que n'importe lequel des joueurs classés
Vous devez écrire une fonction tete_de_serie(participants, classement)
prenant en arguments la liste des joueurs inscrits au tournoi ainsi que le classement et renvoyant le prénom du joueur le mieux classé.
Il y a plusieurs solutions, par exemple :
-
Proposition 1 : donner un classement arbitraire aux participants non classés et les comparer avec les joueurs classés
-
Proposition 2 : filtrer la liste des participants afin de ne conserver que les joueurs classés :
- si cette liste est vide, le tournoi ne compte que des participants non classés. La tête de série est donc le premier joueur
- sinon, il est inutile de considérer les non-classés, la tête de série sera obligatoirement un joueur classé
Attention
Le dictionnaire classement
ne devra pas être modifié lors de l'exécution de la fonction
Si le tournoi ne comporte que des joueurs non classés, la fonction renverra le prénom du premier joueur de la liste.
Exemples
>>> classement = {'Novak': 1, 'Daniil': 2, 'Alexander': 3, 'Stefanos': 4, 'Rafael': 5}
>>> participants = ['Stefanos', 'Novak', 'Rafael']
>>> tete_de_serie(participants, classement)
'Novak'
>>> participants = ['Stefanos', 'Rafael', 'David', 'Novak']
>>> tete_de_serie(participants, classement)
'Novak'
>>> participants = ['David', 'Novak', 'Alexander', 'Daniil']
>>> tete_de_serie(participants, classement)
'Novak'
>>> participants = ['David', 'Olivier']
>>> tete_de_serie(participants, classement)
'David'
def tetepy-unddepy-undserie(participants, classement):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nl# Tous les joueurs classésbksl-nlclassement = {"Novak": 1, "Daniil": 2, "Alexander": 3, "Stefanos": 4, "Rafael": 5}bksl-nlparticipants = ["Stefanos", "Novak", "Rafael"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classébksl-nlparticipants = ["Stefanos", "Rafael", "David", "Novak"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classé (bis)bksl-nlparticipants = ["David", "Novak", "Alexander", "Daniil"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Que des joueurs non-classésbksl-nlparticipants = ["David", "Olivier"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "David"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nldef tetepy-unddepy-undserie(participants, classement):bksl-nl # Initialisationbksl-nl meilleurpy-undjoueur = participants[0]bksl-nl if meilleurpy-undjoueur in classement:bksl-nl meilleurpy-undclassement = classement[meilleurpy-undjoueur]bksl-nl else:bksl-nl meilleurpy-undclassement = len(classement) + 1bksl-nlbksl-nl # Recherche de la tête de sériebksl-nl for joueur in participants:bksl-nl if joueur in classement and classement[joueur] < meilleurpy-undclassement:bksl-nl meilleurpy-undjoueur = joueurbksl-nl meilleurpy-undclassement = classement[meilleurpy-undjoueur]bksl-nlbksl-nl return meilleurpy-undjoueurbksl-nlbksl-nlbksl-nl# Testsbksl-nl# Joueurs classésbksl-nlclassement = {"Novak": 1, "Daniil": 2, "Alexander": 3, "Stefanos": 4, "Rafael": 5}bksl-nlparticipants = ["Stefanos", "Novak", "Rafael"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classébksl-nlparticipants = ["Stefanos", "Rafael", "David", "Novak"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Un joueur non-classé (bis)bksl-nlparticipants = ["David", "Novak", "Alexander", "Daniil"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "Novak"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl# Que des joueurs non-classésbksl-nlparticipants = ["David", "Olivier"]bksl-nlassert tetepy-unddepy-undserie(participants, classement) == "David"bksl-nlassert classement == {bksl-nl "Novak": 1,bksl-nl "Daniil": 2,bksl-nl "Alexander": 3,bksl-nl "Stefanos": 4,bksl-nl "Rafael": 5,bksl-nl}bksl-nlbksl-nl
A
Commentaires⚓︎
Le problème revient à sélectionner le minimum dans une liste. Deux subtilités toutefois :
- la liste contient les "étiquettes" des données à comparer (les prénoms des joueurs alors que l'on compare les classements)
- certains joueurs n'ont pas de classement : on utilise alors une valeur par défaut supérieure au plus grand classement possible
Une solution possible⚓︎
{{ IDE('exo_corr') }}
On vérifie tout d'abord que la liste comporte au moins un joueur.
On initialise ensuite la recherche en considérant que le premier joueur participant a le meilleur classement. Si ce joueur n'est pas classé, on lui donne la note de len(classement)+1
.
La suite de la fonction est construite autour d'une boucle Pour chaque. On parcourt l'ensemble des participants et pour chacun on se demande :
- est-il classé ? Si non, il ne peut pas être mieux classé que le "meilleur" actuel
- s'il est classé, est-il mieux classé que le "meilleur" actuel ? Si oui, on met à jour les valeurs
La fonction se termine en renvoyant le prénom du joueur le mieux classé.
Autre solution⚓︎
Si l'on commence par trier les participants entre joueurs classés et non classés, on peut faire :
def tete_de_serie(participants, classement):
participants_classes = [joueur for joueur in participants if joueur in classement]
if participants_classes == []:
meilleur_joueur = participants[0]
else:
meilleur_joueur = participants_classes[0]
for joueur in participants_classes:
if classement[meilleur_joueur] > classement[joueur]:
meilleur_joueur = joueur
return meilleur_joueur
Z