DS MPSI - Gestion des commandes clients - Système de e-commerce

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

Gestion des commandes clients - Système de e-commerce

On modélise des commandes passées par des clients. Les données sont représentées par un dictionnaire :

commandes = {
    "Amina":  [("clavier", 1, 180), ("souris", 2, 60)],
    "Youssef": [("ecran", 1, 1200), ("cable_hdmi", 3, 40)],
    "Sara":   [("souris", 1, 60), ("webcam", 1, 250), ("clavier", 1, 180)],
    "Hamza":  []
}

Chaque tuple (produit, quantite, prix_unitaire) représente une ligne de commande.

On dispose aussi d'un stock :

stock = {
    "clavier": 5,
    "souris": 12,
    "ecran": 2,
    "cable_hdmi": 20,
    "webcam": 3,
    "micro": 4
}
1
Manipulation de listes et tuples 3 questions
Q1

Écrire une fonction produits_client(commandes, nom) qui retourne la liste des produits commandés par nom (sans quantités ni prix).

Exemple

Entrée
produits_client(commandes, "Sara")
Sortie
["souris", "webcam", "clavier"]
Solution — Produits d'un client
def produits_client(commandes, nom):
    if nom not in commandes:
        return []
    
    produits = []
    for produit, qte, prix in commandes[nom]:
        produits.append(produit)
    
    return produits
Q2

Écrire une fonction montant_client(commandes, nom) qui calcule le montant total dépensé par nom.

Exemple

Entrée
montant_client(commandes, "Amina")
Sortie
300
Explication : 1 × 180 + 2 × 60 = 300
Solution — Montant total d'un client
def montant_client(commandes, nom):
    if nom not in commandes:
        return 0
    
    total = 0
    for produit, qte, prix in commandes[nom]:
        total += qte * prix
    
    return total
Q3

Écrire une fonction nombre_lignes_total(commandes) qui retourne le nombre total de lignes de commande (tous clients confondus).

Exemple

Entrée
nombre_lignes_total(commandes)
Sortie
7
Solution — Nombre total de lignes
def nombre_lignes_total(commandes):
    total = 0
    for nom, lignes in commandes.items():
        total += len(lignes)
    return total
2
Traitement avancé des structures 3 questions
Q4

Écrire une fonction client_plus_gros_panier(commandes) qui retourne le client ayant dépensé le plus. En cas d'égalité, retourner le nom lexicographiquement plus petit.

Exemple

Entrée
client_plus_gros_panier(commandes)
Sortie
"Youssef"
Solution — Client avec le plus gros panier
def client_plus_gros_panier(commandes):
    max_montant = -1
    meilleur_client = None
    
    for client in commandes:
        montant = montant_client(commandes, client)
        
        if montant > max_montant:
            max_montant = montant
            meilleur_client = client
        elif montant == max_montant:
            if meilleur_client is None or client < meilleur_client:
                meilleur_client = client
    
    return meilleur_client
Q5

Écrire une fonction ajouter_ligne(commandes, nom, produit, qte, prix) qui ajoute une ligne de commande au client nom. Si le client n'existe pas, on le crée avec une liste contenant cette ligne.

Solution — Ajouter une ligne de commande
def ajouter_ligne(commandes, nom, produit, qte, prix):
    if nom not in commandes:
        commandes[nom] = []
    
    commandes[nom].append((produit, qte, prix))
    # Modification en place, pas de return
Q6

Écrire une fonction supprimer_produit(commandes, nom, produit) qui supprime toutes les lignes de commande de nom correspondant à produit.

Solution — Supprimer un produit
def supprimer_produit(commandes, nom, produit):
    if nom not in commandes:
        return
    
    # Garder seulement les lignes qui ne correspondent pas au produit
    commandes[nom] = [(p, q, pri) for p, q, pri in commandes[nom] if p != produit]
    
    # Si la liste devient vide, on peut choisir de garder le client avec une liste vide
    # Modification en place, pas de return
3
Analyse des prix et régularité 2 questions
Q7

Écrire une fonction prix_min_client(commandes, nom) qui retourne le plus petit prix unitaire dans les commandes de nom. (Si le client n'a rien commandé, retourner None.)

Exemple

Entrée
prix_min_client(commandes, "Youssef")
Sortie
40
Solution — Prix minimum d'un client
def prix_min_client(commandes, nom):
    if nom not in commandes or not commandes[nom]:
        return None
    
    min_prix = float('inf')
    for produit, qte, prix in commandes[nom]:
        if prix < min_prix:
            min_prix = prix
    
    return min_prix
Q8

On appelle "client régulier" un client qui a commandé le plus grand nombre de lignes. Écrire client_regulier(commandes) (égalité → plus petit nom).

Exemple

Entrée
client_regulier(commandes)
Sortie
"Sara"
Solution — Client régulier
def client_regulier(commandes):
    max_lignes = -1
    meilleur_client = None
    
    for client, lignes in commandes.items():
        nb_lignes = len(lignes)
        
        if nb_lignes > max_lignes:
            max_lignes = nb_lignes
            meilleur_client = client
        elif nb_lignes == max_lignes:
            if meilleur_client is None or client < meilleur_client:
                meilleur_client = client
    
    return meilleur_client
4
Extension - Gestion du stock 2 questions
Q9

Écrire une fonction stock_total(stock) qui retourne la quantité totale en stock (somme des valeurs).

Exemple

Entrée
stock_total(stock)
Sortie
46
Solution — Stock total
def stock_total(stock):
    total = 0
    for quantite in stock.values():
        total += quantite
    return total
Q10

Écrire une fonction produit_max_stock(stock) qui retourne le produit ayant la plus grande quantité en stock. En cas d'égalité, retourner le nom lexicographiquement plus petit.

Exemple

Entrée
produit_max_stock(stock)
Sortie
"cable_hdmi"
Solution — Produit avec le plus de stock
def produit_max_stock(stock):
    max_qte = -1
    meilleur_produit = None
    
    for produit, quantite in stock.items():
        if quantite > max_qte:
            max_qte = quantite
            meilleur_produit = produit
        elif quantite == max_qte:
            if meilleur_produit is None or produit < meilleur_produit:
                meilleur_produit = produit
    
    return meilleur_produit
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.