DS MPSI - Gestion des emprunts de livres

20 Mar 2026 20 Mar 2026 170 vues ESSADDOUKI Mostafa 6 min de lecture
  Structures de données   Listes & Tuples   Dictionnaires & Sets Débutant
4 parties
10 questions
Python - CPGE - MPSI
~45 min

Gestion des emprunts de livres - Bibliothèque scolaire

On modélise des emprunts de livres effectués par des élèves. Les données sont représentées par un dictionnaire :

emprunts = {
    "Amina": [("python", 2), ("algebre", 1), ("reseaux", 1)],
    "Youssef": [("python", 1), ("analyse", 2)],
    "Sara": [("ia", 1), ("python", 1), ("analyse", 1), ("sql", 1)],
    "Hamza": []
}

Chaque tuple (livre, duree) signifie : livre emprunté pour duree semaines.

On dispose aussi d'un catalogue (quantités disponibles) :

catalogue = {
    "python": 3,
    "algebre": 2,
    "analyse": 2,
    "sql": 4,
    "ia": 1,
    "bd": 2
}
1
Listes et tuples   3 questions
Q1

Écrire une fonction livres_eleve(emprunts, nom) qui retourne la liste des titres empruntés par nom (sans durées).

  Exemple

Entrée
livres_eleve(emprunts, "Sara")
Sortie
["ia", "python", "analyse", "sql"]
  Solution — Livres d'un élève
def livres_eleve(emprunts, nom):
    if nom not in emprunts:
        return []
    
    livres = []
    for livre, duree in emprunts[nom]:
        livres.append(livre)
    
    return livres
Q2

Écrire une fonction duree_totale(emprunts, nom) qui calcule la durée totale (somme des durées) des emprunts de nom.

  Exemple

  Entrée
duree_totale(emprunts, "Amina")
  Sortie
4
Explication : 2 + 1 + 1 = 4
  Solution — Durée totale
def duree_totale(emprunts, nom):
    if nom not in emprunts:
        return 0
    
    total = 0
    for livre, duree in emprunts[nom]:
        total += duree
    
    return total
Q3

Écrire une fonction nb_emprunts_total(emprunts) qui retourne le nombre total de lignes d'emprunt (tous élèves confondus).

  Exemple

  Entrée
nb_emprunts_total(emprunts)
Sortie
9
  Solution — Nombre total d'emprunts
def nb_emprunts_total(emprunts):
    total = 0
    for nom, liste_emprunts in emprunts.items():
        total += len(liste_emprunts)
    return total
2
Sets et traitements   2 questions
Q4

Écrire livres_communs(emprunts, nom1, nom2) qui retourne l'ensemble des livres empruntés par nom1 et nom2.

  Exemple

  Entrée
livres_communs(emprunts, "Youssef", "Sara")
  Sortie
{"python", "analyse"}
  Solution — Livres communs
def livres_communs(emprunts, nom1, nom2):
    if nom1 not in emprunts or nom2 not in emprunts:
        return set()
    
    # Créer des ensembles de livres pour chaque élève
    livres1 = {livre for livre, duree in emprunts[nom1]}
    livres2 = {livre for livre, duree in emprunts[nom2]}
    
    # Retourner l'intersection
    return livres1 & livres2
Q5

Écrire eleves_ayant_emprunte(emprunts, livre) qui retourne la liste (triée par ordre lexicographique) des élèves ayant emprunté livre.

  Exemple

  Entrée
eleves_ayant_emprunte(emprunts, "python")
  Sortie
["Amina", "Sara", "Youssef"]
  Solution — Élèves ayant emprunté un livre
def eleves_ayant_emprunte(emprunts, livre):
    eleves = []
    for nom, liste_emprunts in emprunts.items():
        for l, duree in liste_emprunts:
            if l == livre:
                eleves.append(nom)
                break  # Un élève n'apparaît qu'une fois
    
    # Trier par ordre lexicographique
    eleves.sort()
    return eleves
3
Dictionnaires et mises à jour   2 questions
Q6

Écrire ajouter_emprunt(emprunts, nom, livre, duree) qui ajoute la ligne (livre, duree) à l'élève nom. Si l'élève n'existe pas, on le crée.

Solution — Ajouter un emprunt
def ajouter_emprunt(emprunts, nom, livre, duree):
    if nom not in emprunts:
        emprunts[nom] = []
    
    emprunts[nom].append((livre, duree))
    # Pas de return, modification en place
Q7

Écrire duree_min(emprunts, nom) qui retourne la plus petite durée d'emprunt de nom. (Si aucun emprunt, retourner None.)

Exemple

Entrée
duree_min(emprunts, "Youssef")
Sortie
1
Explication : Youssef a emprunté ("python", 1) et ("analyse", 2) → minimum = 1
Cas sans emprunt
Entrée
duree_min(emprunts, "Hamza")
Sortie
None
Solution — Durée minimale
def duree_min(emprunts, nom):
    if nom not in emprunts or not emprunts[nom]:
        return None
    
    min_duree = emprunts[nom][0][1]  # durée du premier emprunt
    for livre, duree in emprunts[nom]:
        if duree < min_duree:
            min_duree = duree
    
    return min_duree
4
Exploitation du catalogue 3 questions
Q8

Écrire catalogue_total(catalogue) qui retourne la quantité totale disponible (somme des valeurs).

Exemple

Entrée
catalogue_total(catalogue)
Sortie
14
Solution — Catalogue total
def catalogue_total(catalogue):
    total = 0
    for quantite in catalogue.values():
        total += quantite
    return total
Q9

Écrire livre_max_catalogue(catalogue) qui retourne le livre ayant la plus grande quantité. En cas d'égalité : retourner le nom lexicographiquement plus petit.

Exemple

Entrée
livre_max_catalogue(catalogue)
Sortie
"sql"
Solution — Livre avec le maximum
def livre_max_catalogue(catalogue):
    max_quantite = -1
    max_livre = None
    
    for livre, quantite in catalogue.items():
        if quantite > max_quantite:
            max_quantite = quantite
            max_livre = livre
        elif quantite == max_quantite:
            if livre < max_livre:
                max_livre = livre
    
    return max_livre
Q10

Écrire besoin_reappro(emprunts, catalogue) qui retourne la liste triée des livres empruntés mais absents du catalogue.

Exemple

Entrée
besoin_reappro(emprunts, catalogue)
Sortie
["reseaux"]
Solution — Livres à réapprovisionner
def besoin_reappro(emprunts, catalogue):
    # Ensemble des livres empruntés
    livres_empruntes = set()
    for nom, liste_emprunts in emprunts.items():
        for livre, duree in liste_emprunts:
            livres_empruntes.add(livre)
    
    # Ensemble des livres dans le catalogue
    livres_catalogue = set(catalogue.keys())
    
    # Livres empruntés mais absents du catalogue
    manquants = livres_empruntes - livres_catalogue
    
    # Retourner la liste triée
    return sorted(list(manquants))
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.