Listes et dictionnaires
Choisir entre accès par indice et accès par clé, rechercher une valeur, compter des occurrences et éviter les partages involontaires.
Environ 40 minutes
- Distinguer indice, clé et valeur
- Choisir une liste ou un dictionnaire adapté
- Écrire et vérifier un comptage d’occurrences
Cherches-tu la troisième mesure ou la mesure associée à un capteur précis ?
La première demande porte sur une position ; la seconde sur une association. Cette différence guide le choix entre une liste et un dictionnaire. Ces types Python permettent de réaliser des structures de données, mais leur interface n’est pas identique. Tu vas choisir un modèle, suivre les modifications et comparer des recherches. Prérequis : boucles, fonctions, tests d’appartenance et affectation. Nous ne détaillons pas le mécanisme interne des tables de hachage.
1. Une liste organise une séquence
Une liste abstraite est une structure linéaire : ses éléments ont un ordre. Son interface peut proposer la consultation d’une tête et d’une suite, ou un accès par position selon la représentation choisie. Une liste Python, de type list, est une séquence mutable à accès par indice. Pour une liste de longueur n, les indices positifs valides vont de 0 à n − 1. L’indice est une position, pas une valeur contenue. Deux cases différentes peuvent contenir la même valeur ; la position reste nécessaire pour les distinguer.
L’écriture valeurs[i] consulte la case d’indice i. L’affectation valeurs[i] = x remplace son contenu sans ajouter une case. La méthode append(x) ajoute une valeur à la fin. La méthode pop(i) retire et renvoie la valeur à une position ; sans argument, elle agit à la dernière position. La présence de x dans valeurs se teste avec x in valeurs : ce test cherche parmi les valeurs, pas parmi les indices. Sur une liste non triée, une recherche séquentielle peut devoir examiner toutes les cases avant de conclure à une absence.
Exemple résolu
Avec valeurs = [6, 1, 6], effectue valeurs[1] = 4 puis x = valeurs.pop(0).
- Étape 1 : Le remplacement agit sur l’indice 1, donc sur la valeur 1. La liste devient [6, 4, 6].
- Étape 2 : Le retrait à l’indice 0 renvoie le premier 6. Les références restantes sont décalées.
- Étape 3 : La liste finale est [4, 6] et x vaut 6. La longueur est passée de trois à deux.
Résultat : Le remplacement conserve la longueur ; le retrait la diminue. Après le retrait, la valeur 4 se trouve désormais à l’indice 0.
Piège à éviter : Utiliser la valeur 1 comme si elle désignait automatiquement sa position confond contenu et indice.
Une structure linéaire peut aussi être réalisée par chaînage : chaque maillon contient une valeur et une référence vers la suite. Consulter le troisième élément demande alors de suivre les liens depuis le début. La même idée abstraite d’ordre peut donc conduire à des coûts différents. Le mot liste ne suffit pas à connaître une complexité : il faut préciser l’interface, la représentation et l’opération. Dans ce chapitre, les codes utilisant des crochets et append concernent les listes Python, pas toutes les structures linéaires possibles.
À toi d'essayer
Une liste de quatre éléments accepte-t-elle valeurs[4] ? Et que désigne valeurs[-1] en Python ?
Voir la réponseMasquer la réponse
Non : les indices positifs sont 0, 1, 2 et 3. En Python, l’indice −1 désigne le dernier élément si la liste n’est pas vide. Sur une liste vide, cet accès provoque aussi une erreur.
2. Un dictionnaire associe des clés à des valeurs
Un dictionnaire associe à chaque clé présente une valeur. La clé sert à retrouver cette valeur ; elle n’est pas un numéro de position imposé. Par exemple, les clés peuvent être des noms de capteurs et les valeurs leurs mesures. Deux clés distinctes peuvent être associées à la même valeur. En revanche, une clé ne porte qu’une valeur à un instant donné : une nouvelle affectation avec cette clé remplace l’ancienne association. Les clés doivent être hachables ; des chaînes ou des entiers conviennent, mais une liste mutable ne peut pas servir directement de clé.
L’expression mesures["A"] lit la valeur associée à la clé A. Si cette clé est absente, elle provoque une KeyError. On peut tester "A" in mesures ou utiliser mesures.get("A", valeur_par_defaut). Le test d’appartenance sur un dictionnaire cherche une clé. Pour chercher une valeur, on parcourt mesures.values(). La méthode items() permet de parcourir les couples clé-valeur. Les dictionnaires Python conservent l’ordre d’insertion pour l’itération ; cela ne transforme pas les clés en indices de séquence. Une clé entière 0 est une clé choisie, pas forcément la première association.
Exemple résolu
On écrit d = {"A" : 3, "B" : 8}, puis d["A"] = 5. Que valent len(d), "A" in d et 8 in d ?
- Étape 1 : La clé A existe déjà : l’affectation remplace 3 par 5, sans créer une troisième clé.
- Étape 2 : Le dictionnaire conserve deux associations. Le test de présence de la clé A est vrai.
- Étape 3 : Le test 8 in d porte sur les clés, A et B. Il est faux, même si 8 est une valeur présente.
Résultat : len(d) vaut 2, "A" in d vaut True et 8 in d vaut False. Pour tester cette valeur, on peut écrire 8 in d.values().
Piège à éviter : Croire que in cherche toujours parmi les valeurs oublie que l’interface d’appartenance dépend du type de structure.
À toi d'essayer
Une association doit mémoriser toutes les températures d’un même capteur. Pourquoi affecter successivement d["A"] = 12 puis d["A"] = 15 ne suffit-il pas ?
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
3. Combiner les structures pour résoudre un problème
Pour compter des occurrences, une liste conserve les observations et un dictionnaire associe chaque valeur rencontrée à son effectif. Au début, aucun effectif n’est connu. À chaque observation, on lit l’effectif courant, ou zéro si la valeur est nouvelle, puis on ajoute un. L’invariant est simple : après k observations traitées, chaque effectif correspond au nombre d’occurrences dans ces k observations. Il permet de justifier le résultat final. Le dictionnaire ne mémorise pas chaque occurrence séparément : il regroupe l’information selon les clés.
Exemple résolu
Compte les occurrences dans ["A", "B", "A", "C", "B", "A"].
- Étape 1 : Définis le comptage pour des valeurs hachables.def compter(valeurs):
effectifs = {}
for valeur in valeurs:
effectifs[valeur] = effectifs.get(valeur, 0) + 1
return effectifs - Étape 2 : Après les deux premières observations, A et B ont chacun l’effectif 1. La troisième observation augmente seulement A.
- Étape 3 : À la fin, les effectifs sont A : 3, B : 2 et C : 1. Leur somme doit être égale à la longueur de la liste, ici 6.
Résultat : La fonction renvoie {"A" : 3, "B" : 2, "C" : 1}. Sur une liste vide, elle renvoie un dictionnaire vide.
Piège à éviter : Réinitialiser effectifs[valeur] à zéro à chaque tour effacerait les occurrences précédentes.
Choisis ensuite la structure selon les questions fréquentes. Pour obtenir une mesure par position et conserver les répétitions, une liste est naturelle. Pour retrouver une valeur à partir d’un identifiant, un dictionnaire est souvent adapté. Une recherche par clé dans un dictionnaire est en général efficace en moyenne, mais cela ne rend pas instantanée la recherche d’une valeur quelconque dans ses valeurs. Il faut préciser ce que l’on cherche. L’accès par indice à une liste et la recherche d’une valeur dans cette liste sont également deux opérations différentes.
Le partage de références concerne aussi ces conteneurs. Après b = a, les deux noms désignent la même liste. Une copie superficielle avec a.copy() crée une nouvelle liste extérieure, mais des listes imbriquées peuvent rester partagées. Par exemple, si une case contient une liste de mesures, copier le dictionnaire extérieur ne recopie pas automatiquement toutes les mesures. Pour vérifier l’indépendance attendue, modifie un élément intérieur et observe les deux structures. La question du partage porte sur les objets atteints, pas seulement sur les noms des conteneurs.
À toi d'essayer
Tu disposes seulement d’un dictionnaire d’effectifs. Peux-tu reconstruire l’ordre exact des observations initiales ? Justifie par deux listes différentes.
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
4. Au bac : choisir et contrôler une structure
Au bac : justifier un choix
- Écris les questions à résoudre : accès par position, recherche par identifiant, conservation des répétitions ou comptage.
- Distingue les données brutes et les informations résumées. Un dictionnaire d’effectifs ne remplace pas une chronologie.
- Spécifie les cas absents : indice invalide, clé inconnue, séquence vide. Choisis un traitement cohérent avec la consigne.
- Teste un cas sans répétition, un cas avec répétitions et un cas vide. Vérifie une propriété globale, comme la somme des effectifs.
- Explique le coût de l’opération utilisée, sans attribuer au type entier le coût d’une seule opération.
Pendant la mise au point, donne des noms qui rendent le rôle visible : indice, cle, mesure, effectif. Un même nom utilisé successivement pour une position puis pour une valeur rend les traces difficiles à lire. N’efface pas un élément d’une liste pendant un parcours dont les indices supposent sa longueur initiale. Pour un filtrage simple, construire une nouvelle liste rend souvent le raisonnement plus clair. Le bon modèle permet de réduire les erreurs avant même d’optimiser le programme.
Vocabulaire
- Indice :
- Position d’un élément dans une séquence.
- Clé :
- Valeur qui identifie une association dans un dictionnaire.
- Recherche séquentielle :
- Examen successif des éléments jusqu’au résultat ou à l’épuisement de la séquence.
- Copie superficielle :
- Nouveau conteneur extérieur qui conserve les références vers les éléments.
La question détermine l’accès
| Besoin | Opération |
|---|---|
| Troisième observation | Accès à l’indice 2. |
| Mesure du capteur A | Consultation de la clé A. |
| Présence d’une mesure égale à 8 | Recherche parmi les valeurs. |
S’entraîner : ouvre l’espace Exercices du site.
À retenir
- L’indice désigne une position ; une clé désigne une association.
- Une affectation sur une clé existante remplace sa valeur.
- Le test in d cherche une clé lorsque d est un dictionnaire.
- Un résumé par effectifs conserve des nombres d’occurrences et perd l’ordre complet.
Fiche de révision
Avant un accès, nomme ce que tu possèdes : position, identifiant ou valeur recherchée.
Pour compter, le cas absent vaut zéro avant la première augmentation.
Un contrôle global utile confronte somme des effectifs et nombre d’observations.
Si les éléments sont eux-mêmes mutables, examine leurs références après une copie extérieure.
Questions fréquentes
Une liste Python est-elle une liste chaînée ?
Non. Elle offre notamment un accès direct par indice ; une représentation chaînée suit des liens.
Deux clés peuvent-elles avoir la même valeur ?
Oui. L’unicité porte sur les clés présentes, pas sur les valeurs associées.
Et maintenant ?
Tu as lu le cours. L’étape suivante tient en une action.
Relis le coursReprends l’essentiel avant de passer à la suite.Prolonge l’expérience !
Continue à explorer ce chapitre à travers de nouvelles activités, des défis et des expériences interactives. Avec Premium, l’apprentissage continue !
Ici, tu débloques aussi 2 corrections détaillées.
Parent ? Suivez les progrès de votre enfant.
