Aller au contenu

Associations clé-valeur

Découverte des dictionnaires

On utilise un dictionnaire pour associer à un nom d'utilisateur son mot de passe.

🐍 Code Python
1
mdp = {"Alice": "MVTMJSUNP", "Bob": "0123"}   

Que renvoie mdp["Alice"] ? Quelle instruction renvoie le mot de passe de Bob ?

Que renvoie mdp["Cléo"] ? mdp["0123"] ? Commenter.

Exécuter mdp["Charles"] = "azerty"​.

Afficher le dictionnaire mdp à l'aide de l'instruction print(mdp) et commenter.

Ajouter au dictionnaire l'utilisateur Évelyne, dont le mot de passe est "fustell".

Bob souhaite modifier son mot de passe en "Monsup3rmotdep@sse!!!".

Écrire l'instruction python correspondante.

  1. Exécuter les instructions :

    1. "Alice" in mdp
    2. "Bob" in mdp
    3. "Cléo" in mdp
    4. "0123" in mdp
    5. not ("Bob" in mdp)
    6. "Cléo" not in mdp
  2. De manière générale, que renvoie k in mdp ?

Un site web souhaite utiliser une fonction de vérification de mot de passe pour authentifier ses utilisateurices. Ceux-ci entrent leur nom d'utilisateur, leur mot de passe dans les champs du formulaires et soumettent la requête au serveur.

Écrire une fonction verifie, qui prend en argument un dictionnaire mdp stockant les mots de passe des utilisateurices, un nom d'utilisateur et une chaine de caractère. Elle renvoie True si chaine est le mot de passe d'utilisateur stocké dans mdp, False sinon.

Pour cela, on accède à la valeur associée à utilisateur dans le dictionnaire mdp, que l'on compare à chaine. On renvoie True si ces deux chaînes de caractères sont égales, False sinon. Attention, il est possible que utilisateur ne soit pas un clé du dictionnaire mdp. Dans ce cas il faut renvoyer False.

🐍 Code Python
1
2
3
4
def verifie(mdp, utilisateur, chaine):
    """ {str: str}, str, str -> bool
    Renvoie True quand chaine est le mot de passe associé à utilisateur dans le dictionnaire des mpds """
    pass

Un hacker mal intentionné parvient à prendre le contrôle du site web. Il souhaite obtenir la liste de tous les utilisateurs ainsi que leurs mots de passe.

🐍 Code Python
1
2
for u in mdp:
    print(u)       
🐍 Code Python
1
2
for u in mdp:
    print(u, mdp[u])       
🐍 Code Python
1
2
for u in mdp.keys():       
    print(u)
🐍 Code Python
1
2
for u, m in mdp.items():       
    print(u, m)
  1. Exécuter les codes ci-dessus.

  2. Lorsque d est dictionnaire, expliquer ce que réalise l'instruction for k in d:

Décompte de votes

Les résultats d'un référendum sont stockés dans une liste :

🐍 Code Python
1
votes = ["oui", "non", "oui", "oui", "oui", "non"]

Écrire le code de la fonction compte_voix prend en argument une liste votes ne contenant que des "oui" et des "non", et renvoie un dictionnaire :

  • dont les clés sont "oui" et "non"
  • la valeur associée à la clé k est le nombre de fois où k apparaît dans la liste vote

Pour cela, on parcourt chaque vote v de la liste votes : si v est un vote 'oui'​, on incrémente la valeur associée à 'oui' dans le decompte des votes, sinon c'est la valeur associée à 'non' que l'on incrémente.

🐍 Code Python
1
2
3
4
5
def compte_voix(votes):
    """ [str] -> {str: int}
    Compte le nombre d'occurrences des votes 'oui' et 'non' """
    decompte = {'oui': 0, 'non': 0}
    # À compléter

Écrire une fonction resultat qui renvoie la chaîne de caractères suivante :

Le {avis} l'emporte avec {pourcentage}% de votes !

{avis} est l'avis majoritaire ("oui" ou "non"​) et {pourcentage} est le pourcentage de votes ayant exprimé cet avis. En cas d'égalité, votre fonction renverra la chaîne de caractères "Les deux avis sont à égalité".

🐍 Code Python
1
2
3
4
def resultats(votes):
    """ [str] -> str
    Renvoie une chaine de caractère décrivant le résultat du vote """
    pass

Anniversaires

On dispose d'un dictionnaire qui associe à chaque prénom le numéro de son mois de naissance.

🐍 Code Python
1
naissances = {"Alvynne" : 3, "Boubakar": 8, "Clément": 1, "Émilie":8}    

Que renvoie l'intruction naissance["Alvynne"] ?

Écrire une fonction anniversaire qui prend en argument un dictionnaire naissances et un prenom et qui renvoie numéro du mois d'anniversaire de prenom.

Si prenom n'est pas présent dans le dictionnaire naissance, alors on renverra -1.

🐍 Code Python
1
2
3
4
def anniversaire(naissances, prenom):
    """ {str: int}, str -> int 
    Renvoie le numero du mois de naissance de prenom, dans naissances """
    pass

Un professeur souhaite utiliser ce dictionnaire pour obtenir automatiquement la liste de tous les anniversaires du mois.

Quelles sont les valeurs successives prises par p lorsque l'on exécute l'intruction :

for p in naissances:

Compléter le code de la fonction anniversaires_du_mois ci-dessous. On utilisera l'instruction lst.append(elt) pour ajouter l'élément elt à la fin de la liste lst.

🐍 Code Python
1
2
3
4
5
6
7
8
def anniversaires_du_mois(naissances, mois):
    """ {str: int}, int -> [str]
    Renvoie la liste des prénoms des naissances du mois """
    prenoms = []
    for p in naissances:
        if ...:
            ....append(...)
    return ...

Écrire le code de la fonction plus_d_anniversaires qui prend en argument un dictionnaire naissances et qui renvoie le numéro du mois pendant lequel il y a le plus de naissances à célébrer. Vous adapterez pour cela l'algorithme de recherche du maximum.

🐍 Code Python
1
2
3
4
def plus_d_anniversaires(naissances):
    """ {str: int} -> int
    Renvoie le numéro du mois pendant lequel il y a le plus d'anniversaires à célébrer """
    pass

Liste de dictionnaires

Un refuge pour animaux dispose de plusieurs enclos. Il stocke ces informations dans une liste de dictionnaires.

🐍 Code Python
1
2
3
4
5
6
animaux = [
  {'nom': 'Medor', 'espece': 'chien', 'age': 5, 'enclos': 5},
  {'nom': 'Tom', 'espece': 'chat', 'age': 7, 'enclos': 4},
  {'nom': 'Belle', 'espece': 'chien', 'age': 6, 'enclos': 3},
  {'nom': 'Mirza', 'espece': 'chat', 'age': 6, 'enclos': 5}
]
  1. Quelle instruction python permet de renvoyer le numéro de l'enclos de Médor ?

  2. Écrire une fonction animaux_refuge qui prend en argument une liste d'animaux et renvoie la liste des noms de tous les animaux du refuge, tout enclos confondus.

    ⚙️ Résultat
    assert animaux_refuge(animaux) == ['Medor', 'Tom', 'Belle', 'Mirza']
    
  3. Écrire une fonction animaux_enclos qui prend en argument une liste d'animaux et un numero d'enclos et renvoie la liste des noms de tous les animaux présents dans l'enclos numero.

    ⚙️ Résultat
    assert animaux_enclos(animaux, 5) == ['Medor', 'Mirza']
    
  4. Écrire une fonction informations qui prend en argument une liste d'animaux, un nom d'animal, et qui renvoie le dictionnaire contenant toutes les informations relatives à nom.

    ⚙️ Résultat
    assert informations(animaux, 'Medor') == {'nom': 'Medor', 'espece': 'chien', 'age': 5, 'enclos': 5}
    

Code Morse

Le code Morse international, est un code permettant de transmettre un texte à l’aide de séries d’impulsions courtes et longues.

Dans ce code, on représente la lettre 'A' par '.-' : pour transmettre la lettre 'A' on utilise une impulsion courte '.'​, puis une impulsion longue '-'.

🐍 Code Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
MORSE = {
    'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.',
    'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---',
    'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---',
    'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-',
    'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--',
    'Z': '--..',
    '0': '-----', '1': '.----', '2': '..---', '3': '...--',
    '4': '....-', '5': '.....', '6': '-....', '7': '--...',
    '8': '---..', '9': '----.',
    '.': '.-.-.-', ',': '--..--', '?': '..--..', "'": '.----.',
    '!': '-.-.--', '/': '-..-.', '(': '-.--.', ')': '-.--.-',
    '&': '.-...', ':': '---...', ';': '-.-.-.', '=': '-...-',
    '+': '.-.-.', '-': '-....-', '_': '..--.-', '"': '.-..-.',
    '$': '...-..-', '@': '.--.-.'
}
  1. Répondre aux questions suivantes à l'aide des informations contenues dans le dictionnaire code_morse.

    1. Comment va-t-on envoyer le texte 'NSI' ?
    2. On reçoit le message '-... .--- .-.'​. Pour faciliter le décodage, on a inséré le caractère ' ' entre les suites de . et - qui correspondent à une lettre.

      À quel texte cela-correspond-t-il ? 2. Écrire une fonction encode qui prend en argument un message écrit avec des caractères alphanumériques et qui renvoie la suite d'impulsions à envoyer en utilisant le code Morse.

    On supposera que tous les caractères de message correspondent à des clés du dictionnaire MORSE. Afin de faciliter la lecture du code morse résultant, on prendra soin de séparer les codes morse de chaque lettre par un espace.

    🐍 Code Python
    1
    2
    3
    def encode(message):
        """ str -> str
        Renvoie le code morse correspondant au message """
    
    🐍 Code Python
    1
    print(encode("SLTTS!"))
    
    ⚙️ Résultat
    ... .-.. - - ... -.-.--
    
  2. Dans cette question, on souhaite décoder une suite de . et de - correspondant à un message reçu en morse.

    1. Écrire une fonction morse_decode qui renvoie un dictionnaire dont :

      • les clés sont des séquences de . et de - ;
      • la valeur associé à la clé k est le caractère alphanunérique correspondant.
      🐍 Code Python
      1
      2
      3
      def morse_decode():
          """ () -> {str: str}
          Renvoie le dictonnaire de décodage du code morse. """
      
      🐍 Code Python
      1
      2
      3
      4
      MORSE_DEC = morse_decode()
      print(MORSE_DEC['...'])          
      print(MORSE_DEC['.-..'])          
      print(MORSE_DEC['-'])          
      
      ⚙️ Résultat
      S
      L
      T
      
    2. La fonction decode prend en argument une chaine de caractères bips constituée uniquement de . et de - correspondant à des codes morses et renvoie le message correspondant. Pour cela :

      • pour chaque caractère b de bips :
        • s'il s'agit d'un . ou d'un - : alors on est en train de lire une séquence morse correspondant à un caractère. On ajoute ce caractère à la variable code.
        • s'il s'agit du caractère ' ' : alors on a finit de lire une séquence morse correspondant à un caractère. On utilise le dictionnaire MORSE_DEC pour obtenir le caractère alphanumérique correspondant à code, et on l'ajoute au message.
      🐍 Code Python
      1
      2
      3
      4
      5
      def decode(bips):
          """ str -> str """
          message = ""
          code = ''
          # À compléter 
      
      🐍 Code Python
      1
      print(decode("... .-.. - - ... -.-.-- "))
      
      ⚙️ Résultat
      SLTTS!