Championnat de football - Analyse des résultats
On modélise les résultats d'un championnat de football. Les données sont représentées par un dictionnaire :
matchs = {
"Raja": [("Wydad", 2, 1), ("FUS", 0, 0), ("CODM", 2, 3)],
"Wydad": [("Raja", 1, 2), ("CODM", 2, 2)],
"FUS": [("Raja", 0, 0), ("CODM", 0, 1)],
"CODM": [("Raja", 3, 2), ("Wydad", 2, 2), ("FUS", 1, 0)]
}
Chaque tuple (adversaire, buts_marques, buts_encaisses) représente un match joué par l'équipe.
Écrire une fonction adversaires(matchs, equipe) qui retourne la liste des adversaires rencontrés par equipe.
Exemple
adversaires(matchs, "Raja")
["Wydad", "FUS", "CODM"]
def adversaires(matchs, equipe):
if equipe not in matchs:
return []
adversaires_liste = []
for adv, buts_pour, buts_contre in matchs[equipe]:
adversaires_liste.append(adv)
return adversaires_liste
Écrire une fonction buts_totaux(matchs, equipe) qui retourne le nombre total de buts marqués par equipe.
Exemple
buts_totaux(matchs, "Raja")
4
def buts_totaux(matchs, equipe):
if equipe not in matchs:
return 0
total = 0
for adv, buts_pour, buts_contre in matchs[equipe]:
total += buts_pour
return total
Écrire une fonction difference_buts(matchs, equipe) qui retourne la différence de buts totale : $$\text{buts marqués} - \text{buts encaissés}$$
def difference_buts(matchs, equipe):
if equipe not in matchs:
return 0
buts_marques = 0
buts_encaisses = 0
for adv, bp, bc in matchs[equipe]:
buts_marques += bp
buts_encaisses += bc
return buts_marques - buts_encaisses
Écrire equipes_invaincues(matchs) qui retourne la liste triée des équipes n'ayant perdu aucun match.
Exemple
equipes_invaincues(matchs)
["CODM"]
def equipes_invaincues(matchs):
invaincues = []
for equipe, liste_matchs in matchs.items():
perdu = False
for adv, bp, bc in liste_matchs:
if bp < bc: # Défaite
perdu = True
break
if not perdu:
invaincues.append(equipe)
# Trier par ordre lexicographique
invaincues.sort()
return invaincues
Écrire adversaires_communs(matchs, eq1, eq2) qui retourne l'ensemble des adversaires communs à eq1 et eq2.
Exemple
adversaires_communs(matchs, "CODM", "Raja")
{"Wydad", "FUS"}
def adversaires_communs(matchs, eq1, eq2):
if eq1 not in matchs or eq2 not in matchs:
return set()
# Créer des ensembles d'adversaires pour chaque équipe
adv1 = {adv for adv, bp, bc in matchs[eq1]}
adv2 = {adv for adv, bp, bc in matchs[eq2]}
# Retourner l'intersection
return adv1 & adv2
Écrire une fonction points(matchs, equipe) qui calcule le nombre de points de equipe selon la règle : $$\text{victoire} = 3,\quad \text{nul} = 1,\quad \text{défaite} = 0$$
def points(matchs, equipe):
if equipe not in matchs:
return 0
total_points = 0
for adv, bp, bc in matchs[equipe]:
if bp > bc:
total_points += 3 # Victoire
elif bp == bc:
total_points += 1 # Nul
# Défaite : 0 point
return total_points
Écrire meilleure_attaque(matchs) qui retourne l'équipe ayant marqué le plus de buts. En cas d'égalité → plus petit nom lexicographiquement.
def meilleure_attaque(matchs):
max_buts = -1
meilleure_equipe = None
for equipe in matchs:
total = buts_totaux(matchs, equipe)
if total > max_buts:
max_buts = total
meilleure_equipe = equipe
elif total == max_buts:
if meilleure_equipe is None or equipe < meilleure_equipe:
meilleure_equipe = equipe
return meilleure_equipe
Écrire classement(matchs) qui retourne une liste triée des équipes par nombre de points décroissant. En cas d'égalité → ordre lexicographique croissant.
def classement(matchs):
# Créer une liste de tuples (points, nom)
equipes_points = []
for equipe in matchs:
pts = points(matchs, equipe)
equipes_points.append((pts, equipe))
# Trier : d'abord par points décroissant, puis par nom croissant
equipes_points.sort(key=lambda x: (-x[0], x[1]))
# Extraire uniquement les noms
return [equipe for pts, equipe in equipes_points]
Écrire ajouter_match(matchs, eq1, eq2, b1, b2) qui ajoute le match aux deux équipes où matchs est le dictionnaire des résultats, eq1 et eq2 sont les noms des deux équipes, et b1, b2 sont les nombres de buts marqués respectivement par eq1 et eq2.
def ajouter_match(matchs, eq1, eq2, b1, b2):
# Ajouter le match pour eq1
if eq1 not in matchs:
matchs[eq1] = []
matchs[eq1].append((eq2, b1, b2))
# Ajouter le match pour eq2
if eq2 not in matchs:
matchs[eq2] = []
matchs[eq2].append((eq1, b2, b1))
# Modification en place, pas de return
Écrire equipe_plus_active(matchs) qui retourne l'équipe ayant joué le plus grand nombre de matchs (égalité → plus petit nom).
def equipe_plus_active(matchs):
max_matchs = -1
plus_active = None
for equipe, liste_matchs in matchs.items():
nb_matchs = len(liste_matchs)
if nb_matchs > max_matchs:
max_matchs = nb_matchs
plus_active = equipe
elif nb_matchs == max_matchs:
if plus_active is None or equipe < plus_active:
plus_active = equipe
return plus_active
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.