Première - TP - Dictionnaires

Pré-requis

Exercices

Dans chacun des exercices suivants, un code de base est proposé. Vous êtes libre de l'utiliser, de le modifier ou de l'ignorer.
Points au Scrabble

Au Scrabble, chaque lettre est associée à un certain nombre de points. Par exemple, la lettre A vaut 1 point, alors que la lettre B vaut 3 points. Le nombre de points obtenu avec un mot est alors la somme des points de chacune des lettres qui le composent.

Écrire une fonction pointsMot qui renvoie le nombre de point du mot mot.

>>> pointsMot("SCRABBLE")
14

Code de base :

def pointsMot(mot):
    # Dictionnaire associant un nombre de points à chaque lettre
    points = {"A":1,"B":3,"C":3,"D":2,"E":1,"F":4,"G":2,"H":4,"I":1,"J":8,"K":10,"L":1,"M":2,"N":1,"O":1,"P":3,"Q":8,"R":1,"S":1,"T":1,"U":1,"V":4,"W":10,"X":10,"Y":10,"Z":10}

    # Votre code ici !

    return 0
Il n'est pas attendu de vérification sur la longueur ou le sens du mot.
Vainqueur

Une compétition d’informatique oppose plusieurs participants, auxquels on demande d’écrire le plus rapidement possible un programme répondant à un problème donné. Les résultats sont inscrits dans un dictionnaire sous la forme nom : tempsnom est le nom du participant et temps représente le temps qu’il a mis pour répondre au problème, en secondes.

Écrire une fonction vainqueur(resultats) qui renvoie le nom du participant ayant gagné la compétition.

>>> resultats = {"Alice": 322, "Bob": 210, "Charlie": 1290}
>>> vainqueur(resultats)
'Bob'

Code de base :

from math import inf # Valeur infinie

def vainqueur(resultats):
    score_min = inf
    nom_vainqueur = ""

    for ... in resultats:
        if ... < score_min:
            score_min = ...
            nom_vainqueur = ...

    return nom_vainqueur
Pourriez-vous améliorer la fonction précédente afin de gérer les cas d'ex-aequo ?
Prix d'un panier de courses

On considère un dictionnaire de la forme suivante :

panier = {"pommes" : [4, 0.5], "poires" : [3, 0.8], "bananes": [1, 1]}

Dans ce dictionnaire, chaque clé est un article présent dans le panier, et chaque valeur est une liste de la forme [nombre, prix_unitaire] . Par exemple, dans le panier ci-dessus, il y a 4 pommes dont le prix unitaire est de 0,5€.

  1. Écrire une fonction prix_total qui retourne le prix total d'un panier.
    >>> panier = {"pommes" : [4, 0.5], "poires" : [3, 0.8], "bananes": [1, 1]}
    >>> prix_total(panier)
    5.4
    

    Code de base :

    def prix_total(panier):
        total = 0
    
        for ... in panier:
            prix_article = ...
            total += ...
    
        return total
    
  2. Écrire une fonction ticket_caisse qui affiche en détails le prix des articles du panier de la façon suivante :
    >>> panier = {"pommes" : [4, 0.5], "poires" : [3, 0.8], "bananes": [1, 1]}
    >>> ticket_caisse(panier)
    pommes : 4*0.5 = 2.0€
    poires : 3*0.8 = 2.4€
    bananes : 1*1 = 1€
    -----
    Total : 5.4€
    
Résultats à un QCM

Les réponses correctes d'un QCM de NSI sont stockées dans un dictionnaire nommé reponses_valides de la forme suivante :

reponses_valides = {"Q1":"c","Q2":"a","Q3":"d","Q4":"c","Q5":"b"}

Les réponses données par un élève sont stockées dans un dictionnaire reponses_eleve dont voici un exemple possible :

reponses_eleve = {"Q1":"b","Q2":"a","Q3":"d","Q5":"a"}

Lorsque l'élève n'a pas répondu à une question, il n'y a pas de clef correspondant au numéro de la question.

La notation du QCM est la suivante : 3 points par réponse correcte, -1 point par réponse incorrecte et 0 si l'on n'a pas répondu.

  1. La fonction points_eleve(reponses_eleve, reponses_valides) renvoie, à partir des dictionnaires reponses_eleve et reponses_valides passées en paramètres, le nombre de points obtenus au QCM par l'élève.
    >>> reponses_valides = {"Q1":"c","Q2":"a","Q3":"d","Q4":"c","Q5":"b"}
    >>> reponses_eleve = {"Q1":"b","Q2":"a","Q3":"d","Q5":"a"}
    >>> points_eleve(reponses_eleve, reponses_valides)
    4
    
    Compléter la fonction points_eleve ci-dessous :
    def points_eleve(reponses_eleve, reponses_valides):
        points = 0
    
        for num_question in reponses_valides:
            reponse = reponses_valides[...]
            if ... in reponses_eleve:
                if reponses_eleve[...] == ... :
                    points += 3
                else:
                    ...
    
        return points
    
  2. Certains élèves se retrouvent avec des notes négatives... Corriger la fonction pour que le nombre de points soit ramené à 0 si le résultat est négatif.
  3. Écrire une fonction resultats_qcm(dico_reponses_eleves, reponses_valides) qui renvoie un dictionnaire avec la liste des notes de chaque élève, le paramètre dico_reponses_eleves étant un dictionnaire associant à chaque élève un dictionnaire avec ses réponses.
    >>> reponses_valides = {"Q1":"c","Q2":"a","Q3":"d","Q4":"c","Q5":"b"}
    >>> dico_reponses_eleves = {"Alice" : {"Q1":"b","Q2":"a","Q3":"d","Q5":"a"},
    "Bob" : {"Q1":"a","Q2":"a","Q3":"c","Q4":"d","Q5":"a"},
    "Charlie" : {"Q1":"c","Q2":"a"}}
    >>> resultats_qcm(dico_reponses_eleves, reponses_valides)
    {"Alice": 4, "Bob": 0, "Charlie": 6}
    
    Ne pas hésiter à utiliser la fonction points_eleve précédente !

TP : une liste de contacts

à venir