DS MPSI - Championnat de football - Analyse des résultats

20 Mar 2026 20 Mar 2026 163 vues ESSADDOUKI Mostafa 6 min de lecture
Sport Listes & Tuples Dictionnaires & Sets Débutant
4 parties
10 questions
Python - CPGE MPSI
~50 min

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.

1
Manipulation de listes et tuples 3 questions
Q1

Écrire une fonction adversaires(matchs, equipe) qui retourne la liste des adversaires rencontrés par equipe.

Exemple

Entrée
adversaires(matchs, "Raja")
Sortie
["Wydad", "FUS", "CODM"]
Solution — Adversaires
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
Q2

Écrire une fonction buts_totaux(matchs, equipe) qui retourne le nombre total de buts marqués par equipe.

Exemple

Entrée
buts_totaux(matchs, "Raja")
Sortie
4
Explication : 2 + 0 + 2 = 4
Solution — Buts totaux
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
Q3

Écrire une fonction difference_buts(matchs, equipe) qui retourne la différence de buts totale : $$\text{buts marqués} - \text{buts encaissés}$$

Solution — Différence de buts
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
2
Utilisation des sets 2 questions
Q4

Écrire equipes_invaincues(matchs) qui retourne la liste triée des équipes n'ayant perdu aucun match.

Exemple

Entrée
equipes_invaincues(matchs)
Sortie
["CODM"]
Solution — Équipes invaincues
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
Q5

Écrire adversaires_communs(matchs, eq1, eq2) qui retourne l'ensemble des adversaires communs à eq1 et eq2.

Exemple

Entrée
adversaires_communs(matchs, "CODM", "Raja")
Sortie
{"Wydad", "FUS"}
Solution — Adversaires communs
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
3
Analyse avancée des dictionnaires 3 questions
Q6

É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$$

Solution — Calcul des points
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
Q7

Écrire meilleure_attaque(matchs) qui retourne l'équipe ayant marqué le plus de buts. En cas d'égalité → plus petit nom lexicographiquement.

Solution — Meilleure attaque
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
Q8

Écrire classement(matchs) qui retourne une liste triée des équipes par nombre de points décroissant. En cas d'égalité → ordre lexicographique croissant.

Solution — Classement
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]
4
Extension 2 questions
Q9

É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.

Solution — Ajouter un match
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
Q10

Écrire equipe_plus_active(matchs) qui retourne l'équipe ayant joué le plus grand nombre de matchs (égalité → plus petit nom).

Solution — Équipe la plus active
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
Sortie
// La sortie apparaîtra ici…
Prêt · Ctrl+Entrée pour exécuter

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.