Chapitre 8 : Les tuples et les dictionnaires.

Introduction :

Un tuple est une séquence immuable, c'est-à-dire que ses éléments ne peuvent pas être modifiés après sa création. Contrairement aux listes, les tuples sont souvent utilisés pour regrouper des éléments hétérogènes, tels que des coordonnées, dans un ensemble fixe et ordonné.

En informatique, un dictionnaire est une structure de données qui stocke des paires clé-valeur, permettant un accès rapide aux données via une clé unique. Il est très utile pour l'organisation des informations où chaque élément peut être récupéré rapidement par son identifiant.

1. Les tuples

Un tuple est une structure de données très proche des listes : il permet de stocker plusieurs valeurs dans une seule variable.

La différence principale est qu’un tuple est immuable : une fois créé, on ne peut pas modifier ses éléments (ajouter, supprimer ou changer une valeur).

On définit un tuple en utilisant des parenthèses ( ) :

coordonnees = (4, 7)
notes = (15, 12, 18)

Comme pour les listes, on peut accéder aux éléments grâce à leur indice (le premier indice est toujours 0) :

print(coordonnees[0])   # affiche 4
print(notes[2])         # affiche 18

Un tuple peut contenir des données de types différents :

eleve = ("Alice", 16, "Première")
print(eleve[0])   # "Alice"

2. Exercice :

Créer deux tuples en Python :

  • un tuple coordonnees qui contient les valeurs (3, 7)
  • un tuple informations qui contient les valeurs ("Alice", 15, "Seconde")

Rappel : un tuple se définit avec des parenthèses ().

# À compléter coordonnees = ......... informations = .........

Tests :

# Tests

Affichage :

Console:


    
>>>

3. Exercice :

Dans un plan, un point est représenté par un tuple (x, y). Écrire une fonction distance_origine qui prend en paramètre un point et renvoie la distance de ce point à l’origine (0,0).

La distance est calculée avec la formule :

$$\sqrt{x^2 + y^2}$$

Exemple :

>>> distance_origine((3, 4))
5.0
import math def distance_origine(point): x = point[.....] y = ............ return math.sqrt(............)

Tests :

# Tests

Affichage :

Console:


    
>>>

4. Exercice :

On représente deux points par des tuples (x, y). Écrire une fonction distance_points qui prend en paramètres deux tuples et renvoie la distance entre eux.

La distance est calculée avec la formule :

$$\sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}$$

Astuce : on peut utiliser le dépaquetage d’un tuple pour récupérer directement ses valeurs :

point1 = (3, 7)
x1, y1 = point1   # x1 vaut 3 et y1 vaut 7

Exemple :

>>> distance_points((0, 0), (3, 4))
5.0
import math def distance_points(point1, point2): x1, y1 = ....... x2, y2 = ....... return math.sqrt(........................)

Tests :

# Tests

Affichage :

Console:


    
>>>

5. Exercice :

Écrire une fonction meilleure_note qui prend en entrée une liste de tuples, où chaque tuple contient le nom d’un étudiant et sa note. La fonction doit retourner un string correspondant au nom de l’étudiant ayant la meilleure note.

Pour simplifier le problème ici, on considérera qu'il est le seul à avoir eu la meilleure note.

Rappel : on peut utiliser l’affectation multiple pour extraire directement le nom et la note d’un tuple :

etudiant = ("Alice", 85)
nom, note = etudiant   # nom = "Alice", note = 85

Voici une liste pour tester votre fonction :

student_scores = [
    ("Alice", 85),
    ("Bob", 72),
    ("Carol", 90),
    ("David", 60),
    ("Eve", 78),
    ("Frank", 88),
    ("Grace", 92),
    ("Henry", 70),
    ("Ivy", 68),
    ("Jack", 82),
    ("Kelly", 95),
    ("Leo", 73),
    ("Mia", 87),
    ("Nathan", 79),
    ("Olivia", 91),
    ("Paul", 67),
    ("Quinn", 76),
    ("Ryan", 83),
    ("Sophia", 89),
    ("Tyler", 74)
]
student_scores = [ ("Alice", 85), ("Bob", 72), ("Carol", 90), ("David", 60), ("Eve", 78), ("Frank", 88), ("Grace", 92), ("Henry", 70), ("Ivy", 68), ("Jack", 82), ("Kelly", 95), ("Leo", 73), ("Mia", 87), ("Nathan", 79), ("Olivia", 91), ("Paul", 67), ("Quinn", 76), ("Ryan", 83), ("Sophia", 89), ("Tyler", 74) ] def meilleure_note(liste): meilleur_nom = ............ # premier nom de la liste meilleur_score = ........... # première note de la liste for nom, note in liste: # dépaquetage automatique du tuple lors de la boucle if ................. : ................. ................. return meilleur_nom

Tests :

# Tests

Affichage :

Console:


    
>>>

6. Les dictionnaires

En Python, un dictionnaire est une structure qui associe une clé à une valeur. Cela permet de retrouver facilement une information grâce à sa clé, un peu comme dans un vrai dictionnaire où on cherche un mot pour en obtenir la définition.

On écrit un dictionnaire avec des accolades { }, les clés et valeurs étant séparées par :.

eleve = {
    "nom": "Alice",
    "age": 16,
    "classe": "Première"
}

On accède à une valeur en utilisant sa clé entre crochets :

print(eleve["nom"])    # affiche "Alice"
print(eleve["age"])    # affiche 16

On peut aussi ajouter ou modifier une valeur :

eleve["age"] = 17              # modification
eleve["option"] = "Maths"      # ajout d'une nouvelle clé

Enfin, on peut parcourir toutes les clés ou toutes les valeurs :

for cle, valeur in eleve.items():
    print(cle, ":", valeur)

7. Exemple.

Regardons la commande coucou={1:"salut","chocolat":3,6:"avion"}.

1, "chocolat" et 6 sont des clefs.

"salut", 3 et "avion" sont les valeurs associées.

La commande coucou[6] renvoie "avion".

8. Exercice :

Créer un dictionnaire vide appelé personne_1 puis y ajouter les clés "nom", "âge" et "ville" avec des valeurs adaptées pour représenter une personne.

personne_1 = {} # ajoutez les clés et valeurs ici

Tests :

# Tests

Affichage :

Console:


    
>>>

9. Exercice :

Créer un dictionnaire qui associe tous les jours de la semaine à leur numéro (1 pour lundi, 2 pour mardi, …, 7 pour dimanche). Dans ce dictionnaire, le jour est la clé et le numéro est la valeur. Ensuite, afficher le numéro associé à "dimanche".

jours = { # à compléter } print(....)

Tests :

# Tests

Affichage :

Console:


    
>>>

10. Exercice :

Écrire une fonction couleur_fruit qui prend en entrée un dictionnaire dico associant des fruits à leur couleur, ainsi qu’un string nom_fruit correspondant au nom d’un fruit. La fonction doit retourner la couleur associée à ce fruit. Si le fruit n’est pas présent dans le dictionnaire, la fonction retournera "Fruit inconnu".

Voici un dictionnaire pour tester votre fonction :

fruits = {
    "pomme": "rouge",
    "banane": "jaune",
    "orange": "orange",
    "kiwi": "vert",
    "raisin": "violet",
    "citron": "jaune",
    "fraise": "rouge",
    "myrtille": "bleu",
    "abricot": "orange",
    "poire": "vert"
}
fruits = { "pomme": "rouge", "banane": "jaune", "orange": "orange", "kiwi": "vert", "raisin": "violet", "citron": "jaune", "fraise": "rouge", "myrtille": "bleu", "abricot": "orange", "poire": "vert" } def couleur_fruit(dico, nom_fruit): if .................. : return dico[...............] else: return ...............

Tests :

# Tests

Affichage :

Console:


    
>>>

11. Exercice :

Un professeur souhaite analyser les résultats d’un grand test. Pour cela, il dispose d’une liste contenant toutes les notes des élèves. Écrire une fonction frequences_nbs qui prend en entrée une liste de nombres (les notes des élèves) et qui retourne un dictionnaire indiquant la fréquence de chaque note. La fréquence d’une note est égale au nombre d’occurrences de cette note divisé par le nombre total de notes.

def frequences_nbs(liste): dico = {} for nb in liste: if ...............: # le nb est déjà une clé du dictionnaire .............. else: # on crée une nouvelle clé .............. for clef in dico.keys(): dico[clef] = dico[clef] / .......... # on transforme les occurrences en fréquences return dico # Exemple de liste de notes (40 notes) notes = [ 12, 15, 12, 10, 18, 15, 12, 8, 10, 15, 18, 12, 14, 10, 10, 18, 8, 15, 12, 14, 16, 10, 8, 18, 12, 15, 14, 10, 12, 18, 9, 7, 6, 13, 19, 11, 17, 20, 5, 14 ] print(frequences_nbs(notes))

Tests :

# Tests

Affichage :

Console:


    
>>>

12. Exercice :

Écrire une fonction population_totale qui prend comme paramètre un dictionnaire dont les clés sont des pays et les valeurs associées leur population. La fonction doit renvoyer un entier correspondant à la population totale.

Voici un exemple de dictionnaire pouvant être utilisé pour tester la fonction :

country_populations = {
    "Chine": 1444216107,
    "Inde": 1393409038,
    "États-Unis": 332915073,
    "Indonésie": 276361783,
    "Pakistan": 225199937,
    "Brésil": 213993437,
    "Nigéria": 211400708,
    "Bangladesh": 166303498,
    "Russie": 145912025,
    "Mexique": 130262216,
    "Japon": 126050804,
    "Éthiopie": 123849456,
    "Philippines": 113530590,
    "Égypte": 112411076,
    "Vietnam": 97580000,
    "République démocratique du Congo": 89561403,
    "Turquie": 84495243,
    "Iran": 85075571,
    "Allemagne": 83900473,
    "Thaïlande": 69953881,
    "France": 67406000,
    "Monaco": 38300
}
def population_totale(dico): total = 0 for ............. in dico.values(): total += ............. return total # Exemple de dictionnaire country_populations = { "Chine": 1444216107, "Inde": 1393409038, "États-Unis": 332915073, "Indonésie": 276361783, "Pakistan": 225199937, "Brésil": 213993437, "Nigéria": 211400708, "Bangladesh": 166303498, "Russie": 145912025, "Mexique": 130262216, "Japon": 126050804, "Éthiopie": 123849456, "Philippines": 113530590, "Égypte": 112411076, "Vietnam": 97580000, "République démocratique du Congo": 89561403, "Turquie": 84495243, "Iran": 85075571, "Allemagne": 83900473, "Thaïlande": 69953881, "France": 67406000, "Monaco": 38300 }

Tests :

# Tests

Affichage :

Console:


    
>>>

13. Exercice :

Écrire une fonction produit_plus_cher qui prend en entrée un dictionnaire de produits et leur prix, et qui retourne le nom du produit le plus cher.

Voici un dictionnaire pour tester la fonction :

products = {
    "lait": 1.50,
    "pain": 1.20,
    "beurre": 2.30,
    "fromage": 3.50,
    "jus de fruit": 2.80,
    "pâtes": 1.00,
    "riz": 1.10
}
def produit_plus_cher(dico): max_produit = None max_prix = -1 for produit, prix in dico.items(): if ................. : # si le prix est plus grand que max_prix max_prix = ......... max_produit = ......... return max_produit # Exemple de dictionnaire products = { "lait": 1.50, "pain": 1.20, "beurre": 2.30, "fromage": 3.50, "jus de fruit": 2.80, "pâtes": 1.00, "riz": 1.10 }

Tests :

# Tests

Affichage :

Console:


    
>>>

14. La bataille

  1. Dans le jeu de cartes la bataille, la carte "9" l'emporte sur la carte "7" et la carte "dame" l'emporte sur la carte "5".

    Créer un dictionnaire qui fait correspondre à une valeur entre 2 et 14 une carte.

    Ainsi :

    • les nombres entiers de 2 à 10 sont associés aux strings "2" à "10".
    • 11 est associé à "valet", 12 à "dame", 13 à "roi" et 14 à "as".
  2. Programmer une fonction bataille qui prend en paramètres deux entiers entre 2 et 14 et qui retourne le résultat d'une bataille comme dans les exemples ci-dessous.

    Exemples :

    >>> bataille(3,11)
    ["Le premier joueur a la carte 3 et le deuxième joueur a la carte valet.",
     "Le deuxième joueur l emporte avec la carte valet."]
    
    >>> bataille(9,9)
    ["Le premier joueur a la carte 9 et le deuxième joueur a la carte 9.",
     "Egalité entre les deux joueurs."]
# dictionnaire des cartes cartes = { # à compléter } def bataille(carte1, carte2): resultat = [] resultat.append("Le premier joueur a la carte " + ...... + " et le deuxième joueur a la carte " + ....... + ".") if ............ : # cas d'égalité resultat.append("Egalité entre les deux joueurs.") elif ............ : # si carte1 est plus grande resultat.append("Le premier joueur l emporte avec la carte " + cartes[carte1] + ".") else: # sinon, c'est le deuxième joueur resultat.append("Le deuxième joueur l emporte avec la carte " + cartes[carte2] + ".") return resultat

Tests :

# Tests

Affichage :

Console:


    
>>>

15. Exercice : (sujet 7- 2025)

Le nombre d’occurrences d’un caractère dans une chaîne est le nombre d’apparitions de ce caractère dans la chaîne.

Exemples :

  • le nombre d’occurrences du caractère o dans bonjour est 2 ;
  • le nombre d’occurrences du caractère b dans Bébé est 1 ;
  • le nombre d’occurrences du caractère B dans Bébé est 1 ;
  • le nombre d’occurrences du caractère dans Hello world ! est 2.

On souhaite stocker ces nombres d’occurrences dans un dictionnaire dont les clefs sont les caractères de la chaîne et les valeurs le nombre d’occurrences de ces caractères.

Par exemple : avec la phrase Hello world ! le dictionnaire est le suivant :

{'H': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 2, 'w': 1, 'r': 1, 'd': 1, '!': 1}

L’ordre des clefs n’a pas d’importance.

Écrire une fonction nbr_occurrences prenant comme paramètre une chaîne de caractères chaine et renvoyant le dictionnaire des nombres d’occurrences des caractères de cette chaîne.

def nbr_occurrences(chaine): # à compléter

Tests :

# Tests

Affichage :

Console:


    
>>>

16. Exercice :

Écrire une fonction regrouper_mots_par_longueur qui prend en entrée une liste de mots et retourne un dictionnaire où :

  • les clés sont les longueurs des mots,
  • les valeurs sont des listes contenant tous les mots de cette longueur.

Par exemple, si on appelle la fonction sur la liste suivante :

liste_animaux = ["chat", "chien", "éléphant", "souris", "cheval", "oiseau", "abeille", "tigre", "serpent"]

Alors la fonction pourra renvoyer un dictionnaire du type :

{4: ["chat"],
 5: ["chien", "tigre"],
 6: ["souris", "cheval"],
 7: ["oiseau", "serpent", "abeille"],
 8: ["éléphant"]}

(L’ordre des clés n’a pas d’importance.)

def regrouper_mots_par_longueur(liste_mots): # à compléter liste_animaux = ["chat", "chien", "éléphant", "souris", "cheval", "oiseau", "abeille", "tigre", "serpent"]

Tests :

# Tests

Affichage :

Console:


    
>>>

17. Exercice :

Écrire une fonction regrouper_etudiants_par_note qui prend en entrée une liste de dictionnaires représentant des étudiants (chaque dictionnaire contient un "nom" et une "note"), et retourne un dictionnaire qui associe chaque note à une liste des étudiants ayant obtenu cette note.

Une liste d'étudiants est donnée pour tester la fonction.

def regrouper_etudiants_par_note(etudiants): dico = {} for etu in etudiants: note = etu["note"] nom = etu["nom"] if note in dico: dico[note].append(nom) else: dico[note] = [nom] return dico etudiants = [ {"nom": "Alice", "note": 82}, {"nom": "Bob", "note": 72}, {"nom": "Carol", "note": 90}, {"nom": "David", "note": 60}, {"nom": "Eve", "note": 82}, {"nom": "Frank", "note": 88}, {"nom": "Grace", "note": 92}, {"nom": "Henry", "note": 70}, {"nom": "Ivy", "note": 68}, {"nom": "Jack", "note": 82}, {"nom": "Kelly", "note": 70}, {"nom": "Leo", "note": 73}, {"nom": "Mia", "note": 82}, {"nom": "Nathan", "note": 70}, {"nom": "Olivia", "note": 91}, {"nom": "Paul", "note": 70}, {"nom": "Quinn", "note": 82}, {"nom": "Ryan", "note": 70}, {"nom": "Sophia", "note": 89}, {"nom": "Tyler", "note": 82} ]

Tests :

# Tests

Affichage :

Console:


    
>>>