Les dictionnaires et les ensembles en Python
DébutantUnité 7 sur 10 de la formation Formation : Python : variables, boucles, fonctions et fichiers
Ce que tu vas apprendre
- Expliquer ce qu’est un dictionnaire, en construire un à partir de paires clé-valeur, lire des valeurs par leur clé sans interrompre le programme lorsqu’une clé manque, et ajouter, modifier et supprimer des entrées.
- Construire des dictionnaires à partir de paires clé-valeurDécrire un dictionnaire comme une collection qui associe des clés uniques à des valeurs, écrire des littéraux de dictionnaire, construire des dictionnaires avec
dict()et choisir des clés acceptées par Python. - Accéder sans risque aux valeurs par leur cléLire une valeur avec les crochets, vérifier l’existence d’une clé avec
inet utiliserget()pour fournir une valeur par défaut au lieu d’interrompre le programme lorsqu’une clé manque. - Ajouter, modifier et supprimer des entréesInsérer de nouveaux éléments, mettre à jour les valeurs existantes, fusionner deux dictionnaires et supprimer des entrées avec
del,pop()et des méthodes apparentées.
- Construire des dictionnaires à partir de paires clé-valeur
- Parcourir chaque clé, valeur ou paire d’un dictionnaire, calculer des totaux et produire des rapports triés, puis créer de nouveaux dictionnaires avec des boucles et des dictionnaires en compréhension.
- Parcourir les clés, les valeurs et les pairesUtiliser des boucles
foravec un dictionnaire,.values()et.items(), trier les clés par nom ou par valeur et éviter de modifier la taille d’un dictionnaire pendant son parcours. - Construire de nouveaux dictionnaires à partir de données existantesCréer des dictionnaires avec des boucles et des dictionnaires en compréhension pour transformer des valeurs, filtrer des éléments, associer des listes et échanger les clés et les valeurs.
- Parcourir les clés, les valeurs et les paires
- Utiliser un dictionnaire comme ensemble de compteurs, rassembler des éléments en groupes et calculer des totaux par catégorie : des tâches courantes que les dictionnaires réalisent dans les programmes.
- Compter les occurrencesConstruire un tableau des effectifs avec un dictionnaire de compteurs, compter les mots d’un texte, trouver les éléments les plus fréquents et reconnaître
Countercomme un raccourci. - Regrouper des éléments et totaliser des valeurs par catégorieRassembler des éléments dans des listes sous une clé commune, additionner des montants par catégorie, calculer les moyennes des groupes et éviter que des clés partagent accidentellement des listes.
- Compter les occurrences
- Représenter des enregistrements sous forme de dictionnaires dans des dictionnaires ou des listes, lire et mettre à jour des valeurs à n’importe quel niveau, et parcourir des données imbriquées pour les résumer.
- Stocker des enregistrements dans des dictionnaires imbriqués et y accéderConstruire des dictionnaires de dictionnaires, des listes de dictionnaires et des dictionnaires de listes, accéder aux valeurs par des accès en chaîne, les mettre à jour et copier sans risque des données imbriquées.
- Parcourir et résumer des données imbriquéesUtiliser des boucles, notamment des boucles imbriquées, pour présenter, filtrer et résumer des enregistrements, et traiter les enregistrements qui ont des champs manquants ou des listes vides.
- Stocker des enregistrements dans des dictionnaires imbriqués et y accéder
- Créer des ensembles de valeurs uniques, tester l’appartenance, comparer des collections par union, intersection et différence, et choisir entre listes, tuples, dictionnaires et ensembles.
- Créer des ensembles et supprimer les doublonsÉcrire et modifier des ensembles, expliquer pourquoi ils ne contiennent ni doublons ni ordre, tester l’appartenance et supprimer les doublons d’une liste en conservant ou non son ordre.
- Comparer des collections avec les opérations ensemblistesUtiliser l’union, l’intersection, la différence et la différence symétrique, tester les sous-ensembles, les sur-ensembles et les ensembles disjoints, et distinguer les opérateurs qui renvoient de nouveaux ensembles des méthodes qui modifient un ensemble.
- Choisir la collection adaptée à une tâcheComparer les listes, les tuples, les dictionnaires et les ensembles, choisir la collection nécessaire à une tâche et les combiner, notamment avec des opérations ensemblistes sur les clés de dictionnaires.
- Créer des ensembles et supprimer les doublons
Dictionnaires Python : cours
1Stocker des données dans des dictionnaires et y accéder
Un dictionnaire associe chaque clé à une valeur, ce qui permet de retrouver des contacts, des articles en stock et d’autres enregistrements par leur nom. Pour en construire et en modifier un, il faut d’abord savoir ce qu’une clé désigne et ce que sa valeur signifie. Un accès sans risque permet ensuite au programme de distinguer un enregistrement absent d’une valeur existante égale à zéro. L’ajout, la fusion et la suppression de paires modifient ces informations stockées selon des règles prévisibles pour l’ordre d’insertion.
1.1 Construire des dictionnaires à partir de paires clé-valeur
Un dictionnaire stocke des paires : une clé désigne un élément et sa valeur contient l’information recherchée. Une liste de contacts est un modèle utile : un nom mène à un numéro de téléphone. L’accès à un dictionnaire utilise une clé, même lorsque cette clé est un nombre.
Écrire les paires
ages = {"Ana": 31, "Ben": 27, "Cara": 35}
print(ages["Ben"])
print(len(ages))
Ce code affiche 27, puis 3. Les deux-points associent chaque clé à sa valeur ; les virgules séparent les paires. len compte les paires. Tant {} que dict() créent un dictionnaire vide.
Chaque clé n’apparaît qu’une fois. Dans {"a": 1, "b": 2, "a": 3}, la dernière valeur de "a" remplace la précédente et donne {'a': 3, 'b': 2}. Deux clés différentes peuvent avoir la même valeur : {"Ana": "blue", "Ben": "blue"} contient toujours deux éléments.
Construire à partir d’autres données
Choisis la forme adaptée aux données d’entrée :
colors = dict(red=1, blue=2)
coordinates = dict([("x", 10), ("y", 20)])
labels = dict(zip(["a", "b", "c"], [1, 2, 3]))
La première forme crée des clés sous forme de chaînes à partir des noms des arguments. La deuxième lit une séquence de paires à deux éléments. La troisième associe les éléments correspondants de deux listes et produit {'a': 1, 'b': 2, 'c': 3}. Dans la première forme, les chaînes sont 'red' et 'blue' : il ne s’agit pas de recherches de variables.
Choisir des clés utilisables
Les clés de dictionnaire doivent être hachables. Les chaînes de caractères et les nombres conviennent, tout comme les tuples composés uniquement d’éléments hachables. Les listes, les dictionnaires et les ensembles ordinaires ne peuvent pas servir de clés. Pour une position, utilise (2, 3), un tuple, plutôt que [2, 3], une liste :
board = {(0, 0): "start", (2, 3): "treasure"}
print(board[(2, 3)])
Ce code affiche treasure. Les parenthèses font du couple de coordonnées une seule clé. Un tuple contenant une liste ne respecte toujours pas la règle de hachabilité. Les valeurs d’un dictionnaire n’ont pas cette restriction : une valeur peut être une liste, un autre dictionnaire ou tout autre type.
Des clés numériques égales désignent la même entrée. Puisque 1, 1.0 et True sont considérés comme égaux, {1: "one", 1.0: "float one"} contient une paire, dont la valeur est 'float one'. La chaîne "1" est une clé distincte du nombre 1.
Distinguer l’ordre et l’identité
Depuis Python 3.7, les dictionnaires conservent l’ordre d’insertion. Les âges ci-dessus apparaissent dans l’ordre Ana, Ben, Cara à l’affichage ou lors d’un parcours. Ils restent associés à des clés, pas à des positions de liste : ages[0] cherche la clé 0 et lève KeyError: 0.
Les dictionnaires sont mutables. Après backup = ages, les deux noms désignent le même dictionnaire. Exécuter backup["Ana"] = 32 modifie aussi la valeur accessible par ages. Pour copier le dictionnaire externe, écris backup = ages.copy() ou backup = dict(ages). Des dictionnaires externes distincts peuvent encore partager des listes et des dictionnaires imbriqués.
Points clés
- Chaque clé unique est associée à une valeur ;
len(d)compte les paires. - Les clés doivent être hachables ; les valeurs peuvent être de tout type.
- Des clés égales partagent une entrée et les affectations ultérieures remplacent sa valeur.
- L’ordre d’insertion ne transforme pas les clés d’un dictionnaire en positions.
- L’affectation partage un dictionnaire ;
copy()crée un dictionnaire externe distinct.
1.2 Accéder sans risque aux valeurs par leur clé
Le mode d’accès doit correspondre à ce que signifie une clé manquante dans ton programme. Elle signale parfois une erreur. Parfois, elle est normale, comme pour un produit qui n’a pas encore été compté. Python propose différentes façons de traiter ces cas.
Lire une valeur existante
stock = {"apples": 12, "pears": 0, "plums": 7}
print(stock["plums"])
L’accès par crochets renvoie 7. Les clés doivent correspondre exactement : "Plums" est différent de "plums". La lecture de stock["kiwis"] lève KeyError: 'kiwis', car cette clé est absente. Elle ne fournit ni valeur vide ni effectif nul.
Utilise cet accès direct lorsqu’une clé est obligatoire. Une erreur attire alors l’attention sur des données incomplètes ou une faute de frappe à l’endroit où elle se produit.
Tester la présence d’une clé
L’expression key in stock vérifie si une clé existe. "pears" in stock vaut True, bien que sa valeur stockée soit zéro. "kiwis" not in stock vaut également True.
item = "kiwis"
if item in stock:
print(stock[item])
else:
print("No stock record for", item)
Ici, la clé manquante entraîne l’affichage d’un message. L’accès n’a lieu que dans la branche où la clé existe.
Le test d’appartenance sur un dictionnaire cherche dans les clés. 12 in stock vaut False ; pour savoir si un élément a pour valeur stockée 12, écris 12 in stock.values(). La collection placée après in détermine ce qui est parcouru.
Lire avec une valeur par défaut
stock.get("kiwis") renvoie None sans lever KeyError. Fournis un deuxième argument pour choisir une autre valeur par défaut : stock.get("kiwis", 0) renvoie 0. Aucun des deux appels n’insère de nouvel élément. Après ces deux appels, le dictionnaire ne contient toujours que les pommes, les poires et les prunes.
| Question posée par le programme | Forme utile |
|---|---|
| Quelle est la valeur de cette clé obligatoire ? | stock[item] |
| Cette clé existe-t-elle ? | item in stock |
| Quelle est la valeur, ou la valeur de remplacement si elle est absente ? | stock.get(item, 0) |
La valeur par défaut remplace le résultat d’un accès à une clé manquante, pas une valeur stockée. stock.get("pears", 99) renvoie 0, car les poires ont déjà une valeur.
Ne pas confondre zéro et absence
if stock.get("pears"): teste la valeur de vérité du résultat renvoyé. Zéro est faux, donc cette branche est ignorée. Le même test ignore aussi une clé manquante dont l’accès renvoie None. Pour distinguer ces cas, teste directement l’appartenance de la clé.
Traiter une commande entière
prices = {"coffee": 3.5, "tea": 2.75}
order = ["tea", "coffee", "tea", "soda"]
total = 0
for item in order:
if item in prices:
total += prices[item]
else:
print("No price for", item)
print(total)
Le premier thé porte le total à 2,75, le café le porte à 6,25 et le deuxième thé le porte à 9,0. Le soda produit le message No price for soda et n’ajoute rien. Un accès direct à chaque passage échouerait pour le soda ; utiliser sans avertissement un prix par défaut de zéro masquerait le prix manquant. La branche distincte rend cette information manquante visible.
Points clés
d[key]lèveKeyErrorlorsque la clé manque.inteste les clés, y compris celles dont les valeurs sont nulles ou vides.getrenvoie une valeur ou une valeur par défaut sans insérer de clé.- Ne choisis une valeur par défaut que si elle a un sens pour la tâche.
1.3 Ajouter, modifier et supprimer des entrées
Les mises à jour d’un dictionnaire utilisent les clés pour désigner ce qui change. L’affectation d’une valeur peut ajouter une paire ou remplacer une ancienne valeur. La suppression d’une paire peut aussi renvoyer une information utile, comme la quantité retirée d’un stock.
Ajouter et remplacer
scores = {"Ana": 8}
scores["Ben"] = 6
scores["Ana"] = 9
scores["Ben"] += 2
print(scores)
Le résultat est {'Ana': 9, 'Ben': 8}. Ben est ajouté, la valeur d’Ana est mise à jour, puis le score existant de Ben augmente. La ligne avec += lit d’abord l’ancienne valeur ; elle lève donc KeyError si la clé manque. Les dictionnaires n’ont pas de méthode append.
Combiner des dictionnaires
update copie des paires dans un dictionnaire existant. Avec ces scores, scores.update({"Ben": 7, "Cara": 10}) fait passer le score de Ben à 7 et ajoute Cara avec 10.
Depuis Python 3.9, l’opérateur de fusion peut construire un nouveau dictionnaire :
left = {"x": 1, "y": 2}
right = {"y": 5, "z": 3}
merged = left | right
print(merged)
Ce code affiche {'x': 1, 'y': 5, 'z': 3}. Pour une clé commune, la valeur de droite l’emporte. left reste inchangé ; left |= right le mettrait à jour en place.
update() renvoie None. Écrire scores = scores.update(new_scores) modifie l’ancien dictionnaire, puis fait référence à None avec scores. Appelle update sur une ligne distincte. Affecte le résultat de left | right lorsque tu veux un nouveau dictionnaire fusionné.
Supprimer des paires
| Opération | Effet et valeur de retour |
|---|---|
del d[key] | Supprime la paire ; une clé manquante lève KeyError. |
d.pop(key) | Supprime la paire et renvoie sa valeur ; une clé manquante lève KeyError. |
d.pop(key, 0) | Renvoie 0 si la clé est absente. |
d.popitem() | Supprime et renvoie la paire insérée le plus récemment sous forme de tuple. |
d.clear() | Supprime toutes les paires et renvoie None. |
Pour {"a": 1, "b": 2, "c": 3}, popitem() renvoie ('c', 3). Cette méthode utilise l’ordre d’insertion, et non l’ordre alphabétique ou la plus grande valeur.
Suivre une modification de stock
inventory = {"pens": 10, "pads": 4}
inventory["pens"] -= 3
inventory["clips"] = 50
removed = inventory.pop("pads")
Après la vente, il reste 7 stylos. L’ajout de trombones crée une nouvelle clé. Le retrait des blocs-notes stocke 4 dans removed et laisse {'pens': 7, 'clips': 50}. La valeur renvoyée par pop permet au programme d’utiliser la quantité retirée après la suppression de la paire.
Insérer uniquement en cas d’absence
setdefault(key, default) renvoie la valeur existante, ou insère et renvoie la valeur par défaut lorsque la clé manque. Pour stock = {"apples": 12, "pears": 0, "plums": 7}, stock.setdefault("kiwis", 0) insère les kiwis et renvoie 0. stock.setdefault("apples", 99) renvoie 12 et ne modifie pas la valeur des pommes. Cette insertion fait la différence avec get.
La mise à jour d’une clé existante ne change pas sa place. À partir de {"a": 1, "b": 2, "c": 3}, l’instruction d["a"] = 10 conserve "a" en première place. Supprimer "a" puis l’insérer à nouveau la place après "c". Le remplacement d’une valeur et l’insertion d’une nouvelle paire ont des effets différents sur l’ordre.
Points clés
d[key] = valueajoute une clé ou remplace sa valeur.- Lors d’une fusion de dictionnaires, la valeur de droite l’emporte pour une clé commune.
poprenvoie une valeur supprimée ;popitemrenvoie la dernière paire insérée.updateetclearrenvoientNone.setdefaultn’insère une valeur par défaut que pour une clé absente.- Une mise à jour conserve la place d’une clé ; sa suppression suivie de sa réinsertion la déplace à la fin.
2Parcourir des dictionnaires et en construire de nouveaux
Les boucles permettent de produire un rapport ou un total à partir d’un dictionnaire, ou de l’utiliser pour créer une nouvelle collection. Il faut d’abord choisir ce dont chaque passage a besoin : une clé, une valeur ou les deux parties d’une paire. Le tri détermine l’ordre d’un rapport sans modifier celui du dictionnaire d’origine. Une compréhension peut exprimer une règle courte pour conserver ou transformer des paires, tandis qu’une boucle ordinaire laisse de la place pour plusieurs étapes de traitement et vérifications.
2.1 Parcourir les clés, les valeurs et les paires
Choisis une boucle qui te donne la partie de chaque paire dont tu as besoin. Un dictionnaire seul fournit les clés. Ses vues peuvent fournir les valeurs ou les paires entières, afin que tu n’aies pas à retrouver une information que la boucle pourrait te donner directement.
Parcourir les clés, les valeurs ou les paires
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
for day, temp in temps.items():
print(day, temp)
Les températures sont en degrés Fahrenheit. Ce code affiche Mon 68, Tue 75 et Wed 71 sur des lignes distinctes, dans l’ordre d’insertion. Chaque élément est un tuple à deux éléments que la boucle dépaquette dans day et temp.
| Entrée de la boucle | Ce que reçoit chaque passage |
|---|---|
temps ou temps.keys() | Une clé correspondant à un jour |
temps.values() | Une valeur de température |
temps.items() | Une paire (day, temperature) |
Avec for day in temps:, utilise temps[day] dans la boucle lorsque tu as besoin de la valeur correspondante. Si le programme a besoin des deux parties à chaque passage, .items() exprime généralement la tâche plus clairement.
Comprendre les vues
keys(), values() et items() renvoient des vues, qui reflètent les modifications ultérieures de leur dictionnaire. Ce ne sont pas des listes et elles ne permettent pas l’accès par indice. temps.keys()[0] lève TypeError. Convertis la vue en liste si tu as besoin d’un instantané avec des positions : list(temps) donne ['Mon', 'Tue', 'Wed'].
Calculer un total ou trouver une clé correspondante
sum(temps.values()) renvoie 214, et la division par len(temps) donne une moyenne d’environ 71,33. max(temps.values()) renvoie 75. Pour trouver le jour associé à cette valeur, écris max(temps, key=temps.get), qui renvoie 'Tue'.
L’argument key= fournit une fonction utilisée pour la comparaison. Ici, Python parcourt les clés des jours et appelle temps.get pour chacune afin d’obtenir sa température. Écris le nom de la fonction sans l’appeler : temps.get, pas temps.get(). En cas d’égalité entre les valeurs, max renvoie la première clé rencontrée.
Trier un rapport
sorted(temps) renvoie les clés dans l’ordre alphabétique. sorted(temps.items()) renvoie les paires triées par clé. Pour trier les clés des jours par température, utilise sorted(temps, key=temps.get), ce qui produit ['Mon', 'Wed', 'Tue']. Ajoute reverse=True pour obtenir ['Tue', 'Wed', 'Mon']. Ces appels renvoient des listes ; ils ne changent pas l’ordre de temps.
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
passing = 0
for name, grade in grades.items():
print(f"{name}: {grade}")
if grade >= 75:
passing += 1
Le rapport affiche chaque nom avec sa note. Ana et Cara atteignent le seuil, donc passing vaut 2 à la fin.
Supprimer des entrées sans perturber le parcours
N’ajoute ni ne supprime de clés pendant que tu parcours directement un dictionnaire. Modifier sa taille peut lever RuntimeError: dictionary changed size during iteration. Remplacer une valeur existante est autorisé.
Pour supprimer les jours les plus frais, utilise for day in list(temps): et supprime temps[day] lorsque sa valeur est inférieure à 70. La boucle parcourt une liste de clés distincte et laisse {'Tue': 75, 'Wed': 71} dans le dictionnaire. Construire un nouveau dictionnaire filtré est une autre façon de séparer le parcours des modifications.
Points clés
- Parcours un dictionnaire pour obtenir les clés,
.values()pour les valeurs ou.items()pour les paires. - Les vues reflètent les modifications ; les listes permettent l’accès par position.
key=d.getcompare les valeurs stockées tout en renvoyant ou en triant les clés.- Le tri renvoie une liste et ne change pas l’ordre du dictionnaire.
- Parcours une copie de la liste des clés pour supprimer des entrées.
2.2 Construire de nouveaux dictionnaires à partir de données existantes
Un nouveau dictionnaire provient souvent d’une règle appliquée à des données existantes. Commence par une boucle que tu peux expliquer, puis utilise une compréhension lorsque la même règle s’exprime clairement en une seule expression.
Construire une paire à la fois
words = ["kiwi", "fig", "banana"]
lengths = {}
for word in words:
lengths[word] = len(word)
À chaque passage, le programme choisit un mot comme clé et sa longueur comme valeur. Le résultat est {'kiwi': 4, 'fig': 3, 'banana': 6}. Le dictionnaire est créé avant la boucle pour que les paires précédentes restent disponibles lors des passages suivants.
Un dictionnaire en compréhension exprime le même travail :
lengths = {word: len(word) for word in words}
Lis la partie for pour voir ce qui est parcouru, puis l’expression qui la précède pour voir quelle paire est produite. Les deux-points séparent l’expression de la clé de celle de la valeur. Sans ces deux-points, {word for word in words} construit un ensemble.
Conserver certains éléments
Une clause if filtre les données d’entrée :
grades = {"Ana": 88, "Ben": 72, "Cara": 95}
high_grades = {
name: grade
for name, grade in grades.items()
if grade >= 80
}
Ana et Cara satisfont la condition, ce qui donne {'Ana': 88, 'Cara': 95}. La paire de Ben est écartée. Le dictionnaire d’entrée ne change pas ; le résultat ne contient que les paires qui satisfont la condition.
Transformer les valeurs
Une compréhension peut conserver les jours tout en convertissant les relevés Fahrenheit en Celsius :
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
celsius = {
day: round((f - 32) * 5 / 9, 1)
for day, f in temps.items()
}
Le résultat est {'Mon': 20.0, 'Tue': 23.9, 'Wed': 21.7}. Pour mardi, soustraire 32 donne 43 ; multiplier par 5 et diviser par 9 donne environ 23,89. round(..., 1) stocke 23,9. La clé reste la même tandis que la valeur change.
Associer les listes avec précaution
dict(zip(names, scores)) associe chaque nom au score situé à la même position. zip s’arrête à la fin de la plus courte des données d’entrée. Associer ["Ana", "Ben", "Cara"] à [90, 85] donne {'Ana': 90, 'Ben': 85}. Aucune erreur ne signale le score manquant de Cara : vérifie donc les longueurs des données d’entrée lorsque chaque nom doit avoir un score.
Échanger les clés et les valeurs
favorites = {"Ana": "blue", "Ben": "red", "Cara": "blue"}
by_color = {color: name for name, color in favorites.items()}
Le résultat est {'blue': 'Cara', 'red': 'Ben'}. Ana et Cara auraient toutes deux besoin de la même nouvelle clé, donc la paire de Cara, qui vient ensuite, remplace celle d’Ana. L’inversion ne conserve toutes les paires que lorsque les anciennes valeurs sont uniques et hachables. Une valeur de type liste ne peut pas du tout devenir une clé de dictionnaire. Pour conserver plusieurs noms sous une même couleur, stocke une liste de noms sous cette couleur.
Utilise une boucle ordinaire lorsque la tâche demande plusieurs instructions, messages ou vérifications. Une compréhension est utile parce qu’elle rend une règle courte visible ; y faire entrer de force une procédure plus longue rend la règle plus difficile à suivre.
Points clés
- Un dictionnaire en compréhension produit une paire clé-valeur pour chaque élément d’entrée sélectionné.
- Une clause
iffiltre ; les expressions de la paire peuvent transformer les données. zips’arrête à la fin de la plus courte des données d’entrée.- L’inversion d’un dictionnaire peut faire perdre des entrées lorsque des valeurs se répètent.
3Compter et regrouper des données avec des dictionnaires
Les dictionnaires peuvent recueillir des résultats pendant qu’une boucle traite des données. Un compteur stocke un nombre par élément distinct ; un dictionnaire de regroupement stocke plusieurs membres sous chaque catégorie. Les deux schémas doivent traiter la première apparition d’une clé et conserver ce que les passages précédents ont accumulé. Une fois les groupes créés, leurs listes permettent de calculer des totaux et des moyennes, et les outils de la bibliothèque standard peuvent raccourcir l’initialisation.
3.1 Compter les occurrences
Un tableau des effectifs indique combien de fois chaque élément distinct apparaît. Ses clés désignent les éléments ; ses valeurs sont des compteurs. Le dictionnaire s’agrandit lorsqu’un nouvel élément apparaît, tandis que les apparitions suivantes augmentent un effectif existant.
Suivre un compteur
counts = {}
for letter in "banana":
if letter in counts:
counts[letter] += 1
else:
counts[letter] = 1
La première lettre crée 'b': 1. La suivante crée 'a': 1, puis la suivante crée 'n': 1. Le "a" suivant porte son effectif existant à 2. Après les deux dernières lettres, le dictionnaire est {'b': 1, 'a': 3, 'n': 2}. Son ordre indique quand chaque lettre est apparue pour la première fois, et non quelle lettre est la plus fréquente.
Utiliser zéro avant la première occurrence
Les deux branches peuvent devenir une seule affectation :
counts = {}
for letter in "banana":
counts[letter] = counts.get(letter, 0) + 1
Le membre de droite lit l’effectif précédent, en utilisant zéro lorsque la clé manque, puis ajoute un. Le membre de gauche stocke ce nouvel effectif. get lui-même n’insère rien ; c’est l’affectation qui le fait.
Utiliser seulement counts[letter] += 1 échoue lorsqu’une lettre est nouvelle. Déplacer counts = {} dans la boucle provoque un autre problème : chaque passage efface les effectifs précédents. Initialise le dictionnaire une fois avant de traiter les éléments.
Déterminer ce qui compte comme un même mot
Pour le texte, la casse et la ponctuation influent sur les clés. Les chaînes "The" et "the" diffèrent, tout comme "dog." et "dog". Nettoie les formes avant de les utiliser comme clés :
text = "The cat saw the dog. The dog ran."
counts = {}
for word in text.lower().split():
word = word.strip(".,!?")
counts[word] = counts.get(word, 0) + 1
Ce code produit {'the': 3, 'cat': 1, 'saw': 1, 'dog': 2, 'ran': 1}. lower traite la casse, split sépare les mots aux caractères d’espacement et strip supprime les caractères de ponctuation indiqués aux extrémités. Cette méthode ne supprime pas la ponctuation au milieu d’un mot.
Trouver les éléments les plus fréquents
Pour ce tableau non vide, max(counts, key=counts.get) renvoie 'the'. Pour trouver les deux mots les plus fréquents, utilise sorted(counts, key=counts.get, reverse=True)[:2], ce qui donne ['the', 'dog']. Les effectifs égaux conservent leur ordre d’origine après le tri.
Ce schéma compte aussi des nombres ou des tuples. Pour les lancers [3, 6, 3, 1, 6, 3], il construit {3: 3, 6: 2, 1: 1}. Une valeur jamais observée n’a pas d’entrée. Lis-la avec une valeur par défaut de zéro lorsque c’est utile.
Reconnaître le raccourci de la bibliothèque
from collections import Counter
letter_counts = Counter("banana")
print(letter_counts.most_common(1))
print(letter_counts["z"])
Ce code affiche [('a', 3)], puis 0. L’importation rend Counter disponible depuis la bibliothèque standard de Python. Un Counter est un dictionnaire conçu pour les comptages : ses clés sont des éléments hachables et l’accès direct à un élément manquant renvoie zéro. Ses effectifs affichés pour cette entrée sont Counter({'a': 3, 'n': 2, 'b': 1}).
Points clés
- Un tableau des effectifs associe chaque élément distinct à son nombre d’occurrences.
- Initialise le dictionnaire avant la boucle.
counts[item] = counts.get(item, 0) + 1traite les éléments nouveaux et répétés.- Nettoie les mots avant de les compter lorsque la casse et la ponctuation doivent être ignorées.
- Compare les effectifs avec
key=counts.getpour classer les éléments. Countercalcule les effectifs et renvoie zéro lors de la recherche d’une clé manquante.
3.2 Regrouper des éléments et totaliser des valeurs par catégorie
Un dictionnaire peut stocker un groupe entier sous chaque clé. La clé nomme la catégorie et une liste contient les éléments qui lui sont affectés. Chaque membre reste ainsi disponible pour des totaux, des moyennes ou des rapports ultérieurs.
Construire des listes distinctes pour les groupes
words = ["apple", "bean", "avocado", "beet", "corn"]
groups = {}
for word in words:
first = word[0]
if first not in groups:
groups[first] = []
groups[first].append(word)
Pour "apple", le programme crée une liste vide sous "a" et y ajoute le mot. "bean" crée une liste distincte sous "b". "avocado" rejoint la liste existante sous "a". Le résultat est {'a': ['apple', 'avocado'], 'b': ['bean', 'beet'], 'c': ['corn']}.
La liste vide n’est créée que pour un nouveau nom de groupe. La créer à chaque passage supprimerait les membres précédents de ce groupe.
Raccourcir l’initialisation
groups.setdefault(word[0], []).append(word) effectue la même étape de regroupement. setdefault renvoie la liste existante s’il y en a une. Sinon, il stocke la liste vide fournie et la renvoie. L’appel suivant à append modifie cette liste renvoyée.
Une autre solution crée automatiquement les listes :
from collections import defaultdict
groups = defaultdict(list)
for word in words:
groups[word[0]].append(word)
Passe list, la fonction qui crée une nouvelle liste, sans parenthèses. Lors de l’accès à une clé manquante, ce defaultdict crée et stocke une nouvelle liste vide. Même une lecture comme groups["z"] insère cette clé manquante. Utilise "z" in groups lorsque tu veux seulement vérifier si un groupe existe.
Garder les listes indépendantes
groups = dict.fromkeys(["a", "b"], []) place la même liste sous les deux clés. Ajouter 1 par groups["a"] donne alors {'a': [1], 'b': [1]}. Les listes sont partagées et non copiées.
Pour commencer avec des listes distinctes, utilise {key: [] for key in keys}, setdefault avec un nouveau [] ou defaultdict(list). Chaque nouvelle catégorie doit recevoir son propre objet liste.
Additionner les montants par catégorie
Le comptage ajoute un à chaque occurrence. Un total par catégorie ajoute le montant de chaque élément :
expenses = [("food", 12.5), ("travel", 30),
("food", 7.25), ("books", 18)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
Le total de l’alimentation commence à 12,5, puis augmente de 7,25 pour atteindre 19,75. Le transport totalise 30 et les livres 18. Stocker amount seul remplacerait le total précédent au lieu de l’augmenter.
Calculer la moyenne d’un groupe ou supprimer ses doublons
Pour scores = {"A": [80, 90], "B": [70]}, parcours scores.items() et calcule sum(values) / len(values). La moyenne du groupe A est de 85,0 ; celle du groupe B est de 70,0. Teste if values: avant de diviser afin de traiter séparément un groupe vide.
Lorsque les répétitions doivent disparaître à l’intérieur de chaque groupe, utilise des ensembles comme valeurs. tags.setdefault(post, set()).add(tag) crée un ensemble pour une nouvelle publication et y ajoute son mot-clé. Un mot-clé répété reste un seul élément ; une liste conserverait chaque occurrence.
Points clés
- Le regroupement associe une catégorie à ses membres, souvent dans une liste.
- Crée une nouvelle liste pour chaque groupe.
setdefaultetdefaultdict(list)simplifient l’initialisation des groupes.- Les totaux par catégorie additionnent les montants ; les moyennes divisent la somme de chaque groupe par son propre effectif.
- Utilise des ensembles comme valeurs de groupe lorsque les membres répétés doivent disparaître.
4Modéliser des données structurées avec des dictionnaires imbriqués
Des champs liés vont ensemble dans un enregistrement, et plusieurs enregistrements peuvent être organisés par identifiant ou conservés comme lignes dans une liste. Pour accéder à la bonne valeur, il faut traverser chaque niveau dans l’ordre. Les rapports combinent ensuite une boucle externe sur les enregistrements avec des accès aux champs ou une boucle interne sur une liste stockée. Les champs facultatifs manquants, les listes vides et les objets internes partagés influent chacun sur la façon de lire, de résumer ou de copier ces enregistrements.
4.1 Stocker des enregistrements dans des dictionnaires imbriqués et y accéder
Un enregistrement rassemble des champs liés, comme l’âge, la filière et les notes d’un étudiant. Un dictionnaire imbriqué stocke un autre dictionnaire comme valeur. Les clés externes peuvent désigner les enregistrements, tandis que les clés internes désignent les champs.
Lire un niveau à la fois
students = {
"ana": {"age": 19, "major": "math", "grades": [88, 92]},
"ben": {"age": 22, "major": "history", "grades": [75, 81, 79]},
}
students["ana"] donne le dictionnaire d’enregistrement d’Ana. Ajouter ["major"] lit sa filière, donc students["ana"]["major"] renvoie 'math'. Pour obtenir la dernière note de Ben, students["ben"]["grades"][-1] accède à l’enregistrement, puis à sa liste, puis au dernier élément de la liste, 79.
Chaque accès agit sur l’objet renvoyé par l’accès précédent. La même syntaxe à crochets peut désigner une clé de dictionnaire à un niveau et une position de liste à un autre.
Modifier un champ ou ajouter un enregistrement
students["ana"]["age"] = 20
students["ben"]["email"] = "ben@example.com"
students["cara"] = {"age": 21, "major": "art", "grades": []}
students["cara"]["grades"].append(90)
Les deux premières lignes modifient ou ajoutent des champs dans des enregistrements existants. La troisième ajoute un enregistrement entier sous un nouvel identifiant. La quatrième accède à la liste des notes de Cara et y ajoute une note.
L’affectation students["dev"]["age"] = 30 échoue, car l’accès externe à "dev" a lieu en premier et lève KeyError: 'dev'. Crée l’enregistrement avant d’affecter ses champs.
Pour une lecture facultative, students.get("dev", {}).get("age") renvoie None. La première valeur par défaut est un dictionnaire vide, donc le deuxième get dispose d’un dictionnaire à lire même si l’enregistrement est absent. Pour ces enregistrements, chaque valeur externe est elle-même un dictionnaire.
Choisir une structure adaptée à l’accès
Une liste de dictionnaires conserve les lignes dans l’ordre :
rows = [{"name": "Ana", "city": "Austin"},
{"name": "Ben", "city": "Denver"}]
print(rows[1]["city"])
Ce code affiche Denver : l’indice de liste d’abord, puis la clé du champ. Un dictionnaire de listes, comme {"A": [80, 90], "B": [70]}, stocke plusieurs valeurs par nom de groupe. Ces structures peuvent être combinées lorsqu’un enregistrement a besoin à la fois de champs nommés et d’une liste ordonnée.
Lorsque les noms désignent les lignes de façon unique, construis by_name = {row["name"]: row for row in rows}. Ensuite, by_name["Ben"] trouve directement la ligne de Ben. Les valeurs sont les dictionnaires de lignes existants : les modifications faites par cet index touchent donc aussi ces lignes. Si des noms se répètent, une ligne ultérieure remplace une ligne précédente sous cette clé.
Copier les données imbriquées en connaissance de cause
backup = students partage le dictionnaire entier. backup = students.copy() crée un dictionnaire externe distinct, mais conserve les mêmes enregistrements internes. Après cette copie superficielle, backup["ana"]["age"] = 99 modifie aussi l’âge d’Ana dans students.
import copy
independent = copy.deepcopy(students)
independent["ana"]["age"] = 25
Pour ces dictionnaires et listes imbriqués, la copie profonde crée aussi des objets internes distincts. Modifier l’âge copié ne change pas l’âge d’origine. Utilise des noms de champs cohérents dans tous les enregistrements pour que le même code d’accès fonctionne pour chacun.
Points clés
- Les accès en chaîne traversent une collection à la fois.
- Crée un dictionnaire interne avant d’y affecter un champ.
- Une liste d’enregistrements utilise d’abord un indice ; un dictionnaire d’enregistrements utilise un identifiant.
- Une copie superficielle partage les enregistrements internes ; une copie profonde sépare les données mutables imbriquées.
4.2 Parcourir et résumer des données imbriquées
Traiter des données imbriquées signifie suivre le niveau atteint par la boucle. Une boucle externe choisit un enregistrement. Un accès à un champ atteint une valeur dans cet enregistrement, puis une boucle interne peut parcourir les éléments d’une liste stockée.
Résumer un enregistrement par passage
students = {
"ana": {"major": "math", "grades": [88, 92]},
"ben": {"major": "history", "grades": [75, 81, 79]},
"cara": {"major": "art", "grades": []},
}
for name, info in students.items():
grades = info["grades"]
major = info["major"]
if grades:
average = sum(grades) / len(grades)
print(f"{name}: {major}, average {average:.1f}")
else:
print(f"{name}: {major}, no grades")
Les notes d’Ana totalisent 180, donc sa moyenne est de 90,0. Le total de Ben est de 235 pour trois notes, ce qui donne environ 78,33 ; le format :.1f affiche 78.3. La liste de Cara est vide, donc le programme affiche cara: art, no grades sans diviser par zéro.
Les affectations à grades et major dans la boucle donnent à chaque nom les valeurs de l’enregistrement courant. La moyenne doit aussi être calculée dans la boucle : elle doit l’être séparément pour chaque étudiant.
Lire les champs facultatifs
info.get("email", "no email") fournit du texte pour un champ de courriel facultatif. Un accès direct avec info["email"] lèverait KeyError pour un enregistrement qui ne le contient pas. La valeur par défaut doit se trouver au niveau où le champ peut manquer. Le get du dictionnaire externe chercherait des identifiants d’étudiants, pas des champs de courriel.
Sélectionner des enregistrements
math_students = []
for name, info in students.items():
if info["major"] == "math":
math_students.append(name)
Ce code produit ['ana']. La condition lit un champ de l’enregistrement courant ; la valeur ajoutée est la clé externe. Si le rapport avait besoin des enregistrements entiers, il pourrait ajouter info à la place. Détermine le type de résultat dont la suite du programme a besoin.
Parcourir chaque note stockée
count = 0
for info in students.values():
for grade in info["grades"]:
if grade > 80:
count += 1
La boucle interne parcourt les notes 88 et 92 d’Ana, puis les notes 75, 81 et 79 de Ben. La liste vide de Cara n’ajoute aucun passage. Trois notes dépassent 80 : 88, 92 et 81. Le compteur est initialisé à l’extérieur des deux boucles, car il décrit tous les étudiants ensemble. Le réinitialiser dans la boucle externe ne conserverait que l’effectif du dernier enregistrement.
Compter les enregistrements selon un champ
majors = {}
for info in students.values():
major = info["major"]
majors[major] = majors.get(major, 0) + 1
Chaque enregistrement ajoute un à l’effectif de sa filière. Pour Ana et Ben seuls, le résultat est {'math': 1, 'history': 1} ; inclure Cara ajoute 'art': 1. Pour totaliser ou regrouper un autre champ, conserve la boucle externe sur les enregistrements et change la valeur apportée par chaque enregistrement.
Pour obtenir des rapports lisibles, affiche une ligne formatée par enregistrement au lieu du dictionnaire imbriqué entier. Dans une f-string, stocke d’abord un champ dans une variable, comme ci-dessus, ou utilise l’autre type de guillemets à l’intérieur des accolades, comme dans f"{name}: {info['major']}".
Points clés
- Une boucle externe choisit un enregistrement ; les accès aux champs agissent à l’intérieur de celui-ci.
- Vérifie qu’une liste n’est pas vide avant de diviser par sa longueur.
- Utilise
getsur l’enregistrement pour un champ facultatif. - Une boucle interne parcourt chaque élément d’une liste d’un enregistrement.
- Place un accumulateur à l’extérieur des boucles dont il combine les résultats.
5Utiliser des ensembles pour supprimer les doublons et comparer des collections
Les ensembles s’intéressent aux valeurs présentes. La suppression des doublons et la comparaison des appartenances deviennent des opérations directes, qu’il s’agisse de trouver les étudiants inscrits à plusieurs cours ou de vérifier les compétences manquantes. L’ordre et les occurrences répétées demandent d’autres collections : le choix compte donc avant de convertir les données. Les ensembles rejoignent aussi les dictionnaires : leurs clés peuvent être comparées comme des ensembles, même lorsque les valeurs stockées diffèrent.
5.1 Créer des ensembles et supprimer les doublons
Un ensemble indique quelles valeurs distinctes sont présentes. Il ne conserve chaque élément qu’une fois et son ordre n’est pas garanti. Les ensembles conviennent aux tests d’appartenance et à la suppression des doublons lorsque le nombre d’occurrences n’a pas d’importance.
Créer un ensemble
colors = {"red", "green"}
numbers = set([3, 1, 3, 2, 1])
print(len(numbers))
print(sorted(numbers))
Ce code affiche 3, puis [1, 2, 3]. Les valeurs répétées en entrée deviennent un seul élément. Un ensemble vide s’écrit set() ; {} crée un dictionnaire vide.
set("banana") parcourt les caractères de la chaîne et ne conserve que les lettres distinctes "a", "b" et "n". {"banana"} fournit la chaîne entière comme un seul élément. Comme pour les clés de dictionnaire, les valeurs numériques égales ne comptent qu’une fois : {1, 1.0, True} contient un élément.
Les éléments doivent être hachables. Les nombres, les chaînes de caractères et les tuples de valeurs hachables conviennent ; les listes, les dictionnaires et les ensembles ordinaires ne conviennent pas. Utilise (1, 2) pour représenter un élément de coordonnées plutôt que [1, 2]. Un frozenset est un ensemble immuable qui peut lui-même être un élément d’ensemble ou une clé de dictionnaire.
Travailler sans positions
colors[0] lève TypeError car un ensemble n’a pas de positions. Son ordre d’affichage n’est pas garanti et les éléments de type chaîne peuvent s’afficher dans un ordre différent lors d’une autre exécution. sorted(colors) produit une nouvelle liste triée lorsque les éléments peuvent être comparés. Cela ne donne pas d’ordre à l’ensemble.
Modifier les éléments
| Opération | Effet |
|---|---|
s.add(x) | Ajoute un élément ; un doublon n’a aucun effet. |
s.update(items) | Ajoute les éléments d’un itérable. |
s.remove(x) | Supprime x ; un élément absent lève KeyError. |
s.discard(x) | Supprime x s’il est présent ; son absence est acceptée. |
s.pop() | Supprime et renvoie un élément arbitraire. |
s.clear() | Supprime tous les éléments. |
add("blue") ajoute une chaîne. update(["blue", "gold"]) ajoute deux chaînes. En revanche, update("blue") ajoute les caractères séparément, car une chaîne est itérable. Les ensembles n’ont pas de méthode append.
Conserver les premières apparitions si nécessaire
list(set(items)) supprime les doublons, mais perd leur ordre d’origine. Si les premières apparitions comptent, utilise l’ordre d’insertion d’un dictionnaire :
items = [3, 1, 3, 2, 1]
unique = list(dict.fromkeys(items))
print(unique)
Ce code affiche [3, 1, 2]. Les valeurs deviennent des clés de dictionnaire : chacune apparaît donc une fois, dans l’ordre de sa première apparition.
Tu peux aussi expliciter les rôles :
seen = set()
unique = []
for item in items:
if item not in seen:
seen.add(item)
unique.append(item)
L’ensemble indique si un élément est déjà apparu ; la liste conserve les premières apparitions dans l’ordre. Les deux formes exigent des éléments d’entrée hachables.
Compter les éléments distincts ou tester l’appartenance
Pour les huit mots de "the cat saw the dog the dog ran".split(), len(set(words)) vaut 5 : the, cat, saw, dog et ran. Ce calcul compte les mots différents, pas leurs fréquences.
Un ensemble d’expéditeurs bloqués permet à sender in blocked d’indiquer si une adresse est présente. Pour les grandes collections, le test d’appartenance dans un ensemble ou un dictionnaire est généralement beaucoup plus rapide que la recherche dans une liste élément par élément.
Points clés
- Un ensemble stocke des éléments hachables uniques sans ordre garanti.
- Utilise
set()pour un ensemble vide ;{}est un dictionnaire. removelève une erreur en cas d’absence ;discardaccepte l’absence.sorted(s)renvoie une liste ; les éléments d’un ensemble n’ont pas de positions.list(dict.fromkeys(items))supprime les répétitions tout en conservant les premières apparitions.len(set(items))compte les valeurs distinctes.
5.2 Comparer des collections avec les opérations ensemblistes
Les opérations ensemblistes expriment des questions d’appartenance à deux collections. Utilise l’opération adaptée à la question : les membres de l’une ou l’autre collection, les seuls membres communs ou les membres restants après des exclusions.
Lire les quatre opérations
Supposons que les inscriptions aux cours soient les suivantes :
python = {"Ana", "Ben", "Cara", "Dev"}
sql = {"Ben", "Dev", "Eli"}
| Expression | Règle d’appartenance | Membres, par ordre alphabétique |
|---|---|---|
| `python | sql` | Dans l’un ou l’autre ensemble, ou les deux |
python & sql | Dans les deux ensembles | Ben, Dev |
python - sql | Dans Python mais pas dans SQL | Ana, Cara |
python ^ sql | Dans un seul des ensembles | Ana, Cara, Eli |
L’union comprend les cinq étudiants une seule fois. L’intersection ne conserve que les deux étudiants communs. La différence part de l’ensemble de gauche et exclut tout ce qui est dans celui de droite. Inverser la différence change la question : sql - python ne contient qu’Eli. La différence symétrique conserve les deux parties qui ne se recoupent pas ; elle est égale à l’union moins l’intersection.
Les formes nommées sont python.union(sql), python.intersection(sql), python.difference(sql) et python.symmetric_difference(sql).
Tester une relation
a <= b vérifie si chaque membre de a appartient à b. C’est le test de sous-ensemble. a < b exige en plus que b ait au moins un membre supplémentaire : a est alors un sous-ensemble strict. a >= b et a > b testent les relations correspondantes de sur-ensemble.
print({"Ben"} <= sql)
print(sql <= sql)
print(sql < sql)
print(python.isdisjoint(sql))
Ces instructions affichent True, True, False et False. Un ensemble est un sous-ensemble de lui-même, mais pas un sous-ensemble strict de lui-même. Des ensembles disjoints n’ont aucun membre commun ; Python et SQL ont Ben et Dev en commun. Les méthodes issubset et issuperset renvoient aussi des résultats booléens.
Garder les résultats séparés ou modifier un ensemble
result = a | b crée un nouvel ensemble et laisse les deux ensembles d’entrée inchangés. Les formes en place a |= b, a &= b, a -= b et a ^= b remplacent le contenu de a par l’union, l’intersection, la différence ou la différence symétrique. Tout autre nom désignant ce même ensemble voit la modification.
Les méthodes d’ensemble nommées acceptent des itérables comme les listes. python.union(["Fay"]) fonctionne. Les opérateurs ensemblistes ordinaires exigent des ensembles comme opérandes : {"a"} | ["b"] lève TypeError.
Utilise | pour combiner des ensembles, pas +. Distingue aussi & de and : {1, 2} and {3} renvoie {3} car l’ensemble de gauche est considéré comme vrai. Cette expression ne calcule pas les membres communs.
Trouver les exigences non satisfaites
required = {"python", "sql", "git"}
skills = {"python", "excel", "git"}
missing = required - skills
extra = skills - required
qualified = required <= skills
L’ensemble des compétences manquantes contient "sql" ; celui des compétences supplémentaires contient "excel". L’intersection contient "git" et "python". qualified vaut False, car au moins une compétence exigée est absente. Un candidat peut avoir de nombreuses compétences et échouer au test de sous-ensemble : tous les éléments exigés doivent être présents.
Points clés
|prend les éléments de l’un ou l’autre ensemble,&ceux des deux et^ceux d’un seul.a - bne conserve que les membres deaabsents deb.<=accepte des ensembles égaux ;<exige un sous-ensemble strict.isdisjointvérifie si les ensembles n’ont aucun membre commun.- Les opérateurs ensemblistes ordinaires créent des résultats ; les formes en place modifient l’ensemble de gauche.
5.3 Choisir la collection adaptée à une tâche
Choisis une collection selon ce que le programme doit en faire. L’ordre, les répétitions, l’accès par nom et la possibilité de modification sont des besoins distincts. Un programme peut utiliser plusieurs types de collections parce que les différentes parties de ses données servent à des tâches différentes.
Comparer les collections natives
| Type | Mode d’accès aux données | Ordre et répétitions | La collection peut-elle être modifiée ? |
|---|---|---|---|
| Liste | Par position | Ordonnée ; répétitions autorisées | Oui |
| Tuple | Par position | Ordonné ; répétitions autorisées | Non |
| Dictionnaire | Par clé | Ordre d’insertion ; clés uniques | Oui |
| Ensemble | Par appartenance | Aucun ordre garanti ; éléments uniques | Oui |
Une liste convient à une suite d’événements : l’ordre compte et le même événement peut se produire plusieurs fois. Un tuple convient à un groupe fixe de valeurs liées, comme des coordonnées. Un tuple peut contenir un objet mutable : ses emplacements fixes ne rendent donc pas tous les objets contenus immuables. Seul un tuple d’éléments hachables peut être une clé de dictionnaire ou un élément d’ensemble.
Un dictionnaire convient à des informations nommées : un identifiant mène à un enregistrement ou un nom de produit mène à une quantité. Ses valeurs peuvent se répéter et être des collections entières. Un ensemble convient à une question d’appartenance : le programme doit savoir si un identifiant est présent, sans avoir besoin d’une valeur distincte pour celui-ci.
Préserver les informations nécessaires à la tâche
Convertir [1, 2, 1] en ensemble fait perdre à la fois l’occurrence répétée et l’ordre de la suite. C’est utile pour une liste d’éléments distincts, mais incorrect pour un journal complet d’événements. Un dictionnaire comme {"reader": True, "editor": True} peut souvent devenir {"reader", "editor"} lorsque les valeurs ne portent aucune information supplémentaire. Si chaque rôle doit avoir un niveau d’autorisation, conserve le dictionnaire.
L’égalité suit le sens de chaque collection. [1, 2] == [2, 1] vaut False, car l’ordre de la séquence diffère. {1, 2} == {2, 1} vaut True. Des dictionnaires contenant des paires clé-valeur égales sont considérés comme égaux même si leurs clés ont été insérées dans des ordres différents. Leur ordre d’insertion influe sur le parcours, pas sur ce test d’égalité.
Comparer les clés de dictionnaires comme des ensembles
store_a = {"pens": 10, "pads": 4, "ink": 2}
store_b = {"pads": 7, "clips": 30, "ink": 5}
common = store_a.keys() & store_b.keys()
only_a = store_a.keys() - store_b.keys()
Les clés communes sont "ink" et "pads" ; only_a contient "pens". Ce sont les produits vendus, quelles que soient leurs quantités. Les deux magasins ont des quantités d’encre différentes, mais l’encre reste une clé commune.
Les vues de clés de dictionnaires acceptent les opérations ensemblistes car les clés sont uniques et hachables. Les vues de valeurs n’acceptent pas ces opérateurs : store_a.values() & {1} lève TypeError. Il est possible de convertir les valeurs en ensemble lorsqu’elles sont hachables, mais cela élimine les valeurs répétées et répond à une autre question que la comparaison des clés de produits.
Combiner des structures dans un programme
Une bibliothèque peut utiliser un dictionnaire associant les identifiants de livres à des dictionnaires d’enregistrements, un ensemble des identifiants actuellement empruntés et une liste des emprunts du jour dans l’ordre chronologique. Un tuple comme ("Dune", 1965) associe un titre et une année. Le dictionnaire permet de trouver les détails d’un livre ; l’ensemble vérifie son statut d’emprunt ; la liste conserve l’historique du jour.
Points clés
- Utilise des dictionnaires pour l’accès par nom ou identifiant et des ensembles pour tester la présence d’éléments distincts.
- Utilise des listes pour les séquences ordonnées et modifiables, et des tuples pour les groupes fixes.
- L’égalité des listes dépend de l’ordre ; celle des dictionnaires et des ensembles n’en dépend pas.
- Les opérations ensemblistes sur les vues de clés comparent les clés, pas les valeurs stockées sous celles-ci.
Dictionnaires Python : exemples
1Construire et tenir à jour un dictionnaire de stock
14 étapes
- 1IntroductionTrouver une information par son nom
Un stock doit associer un nom de produit à sa quantité. Un dictionnaire stocke cette relation sous forme de paire clé-valeur : le nom est la clé et la quantité est la valeur.
Tu vas construire un petit stock, déterminer ce que signifie un produit manquant et suivre les modifications apportées aux produits existants et nouveaux. Suis séparément deux choses : l’existence d’une clé et la valeur qu’elle stocke.
- 2ExempleÉcrire le premier stock
stock = {"pens": 10, "pads": 4}Chaque signe deux-points associe une clé à sa valeur et la virgule sépare les paires.
stock["pens"]lit10;len(stock)vaut2, le nombre de paires.La clé désigne le produit.
stock[0]chercherait la clé0, pas le premier produit. Bien que les dictionnaires conservent l’ordre d’insertion, leurs entrées restent accessibles par leurs clés. - 3ExplicationChoisir des clés que Python peut stocker
Les clés doivent être hachables. Les chaînes de caractères et les nombres conviennent, tout comme les tuples qui ne contiennent que des éléments hachables. Une position comme
(2, 3)peut être une clé, contrairement à la liste[2, 3].Les valeurs peuvent être de tout type, y compris des listes ou des dictionnaires. Cette règle s’applique à la clé : stocker une liste comme valeur n’empêche donc pas la paire d’être valide.
- 4DéfiCompter les paires stockées
Quelle est la longueur de
{"pens": 10, "pads": 4, "pens": 7}et quelle valeur est stockée pour"pens"?---reveal---
La longueur est
2et la valeur des stylos est7. La paire ultérieure remplace l’ancienne valeur sous la même clé. Elle ne crée pas une deuxième entrée pour les stylos. Des clés différentes peuvent partager une valeur, mais une clé ne peut pas contenir deux paires distinctes. - 5ExplicationDéterminer ce que signifie l’absence
stock["clips"]lèveKeyErrorcar le stock actuel n’a pas de clé pour les trombones. Utilise l’accès direct lorsqu’un enregistrement est obligatoire et qu’un enregistrement manquant demande ton attention.stock.get("clips", 0)renvoie à la place la valeur de remplacement zéro sans ajouter les trombones. Cela convient à un calcul où un produit absent doit compter comme un stock nul. Le dictionnaire contient toujours deux entrées après cet appel. - 6Point cléUn zéro stocké possède toujours une clé
Supposons que
stock["pads"] = 0indique que les blocs-notes sont épuisés."pads" in stockvaut toujoursTrue, car l’enregistrement existe.if stock.get("pads"):ignore la branche car zéro est faux. Ce test ne peut pas distinguer un produit épuisé d’un enregistrement manquant qui renvoieNone. Lorsque la question est de savoir si un enregistrement existe, teste la clé avecin. - 7DéfiGarder visibles les produits épuisés
À partir de
stock = {"pens": 10, "pads": 0}, un rapport doit afficher la quantité de blocs-notes et afficher"missing"pour un produit absent. Quel test doit décider s’il faut lirestock[item]?---reveal---
Utilise
if item in stock:. Les blocs-notes satisfont ce test et leur quantité affichée est zéro. Dans la brancheelse, affiche"missing". Un test de la valeur de vérité de la quantité renvoyée traiterait à tort l’enregistrement du produit épuisé comme absent. - 8ExempleAppliquer une vente et une livraison
Commence avec un nouveau stock :
stock = {"pens": 10, "pads": 4} stock["pens"] -= 3 stock["clips"] = 50La vente lit l’ancienne quantité de stylos et stocke
7. La livraison crée une nouvelle clé pour les trombones avec la valeur50. La ligne avec-=exige que les stylos existent déjà ; une affectation simple peut créer une clé manquante. Un dictionnaire n’a pas de méthodeappend. - 9ExempleRécupérer une quantité retirée
Continue avec le stock :
removed = stock.pop("pads")removeddevient4et le dictionnaire devient{"pens": 7, "clips": 50}.popmodifie la collection et renvoie la valeur supprimée.Utilise
del stock["pads"]si tu as seulement besoin de supprimer l’entrée. Les deux formes lèventKeyErroren cas d’absence, sauf sipopreçoit une valeur par défaut, comme dansstock.pop("pads", 0). - 10DéfiTraiter une deuxième suppression
Le stock actuel est
{"pens": 7, "clips": 50}. Que renvoiestock.pop("pads", 0)et que devient le stock ?---reveal---
L’appel renvoie
0et laisse le stock inchangé, car les blocs-notes sont déjà absents. La valeur par défaut évite une erreur de clé manquante ; elle ne crée pas de paire pour les blocs-notes. Une clé existante serait au contraire supprimée et sa valeur stockée serait renvoyée. - 11ExplicationFusionner des paramètres sans perdre la base
Pour deux dictionnaires,
base | overridescrée un nouveau résultat et donne la priorité aux valeurs de droite pour les clés communes :base = {"size": 2, "color": "blue"} result = base | {"size": 5}resulta une taille de5et une couleur"blue";basea toujours une taille de2. Cet opérateur est disponible depuis Python 3.9.base.update(overrides)modifierait plutôt la base et renverraitNone. - 12ConseilSuivre l’ordre au fil des modifications
Remplacer une valeur conserve sa clé à sa place. Supprimer une clé puis l’ajouter à nouveau la place à la fin.
popitem()supprime la paire insérée le plus récemment, pas la plus grande valeur.Distingue aussi les valeurs de retour des méthodes :
update()etclear()renvoientNone, tandis quepop()renvoie une valeur. N’affecte pas le résultat d’une mise à jour au nom dont tu as besoin pour le dictionnaire. - 13DéfiUtiliser une valeur par défaut sans écraser
Un programme commence avec
stock = {"pens": 7}. Il appellestock.get("clips", 20), puisstock.setdefault("clips", 5), puis ajoute2àstock["clips"]. Quelle est la quantité finale de trombones ?---reveal---
Elle est de
7.getrenvoie20mais n’insère rien.setdefaultcrée ensuite l’entrée des trombones avec5, et la dernière mise à jour ajoute2. Une valeur par défaut utilisée lors d’un accès n’est pas une valeur stockée tant qu’une opération ne l’insère pas réellement. - 14RécapitulatifSuivre la clé et la valeur
Construis un dictionnaire à partir de paires clé-valeur, puis choisis délibérément le comportement de l’accès : accès direct pour les enregistrements obligatoires,
inpour l’existence etgetpour une valeur de remplacement.Les affectations ajoutent ou remplacent. Les méthodes de suppression peuvent renvoyer des données utiles et la fusion peut créer un dictionnaire ou modifier un dictionnaire existant. Lorsque tu suis l’exécution du code, note chaque insertion, remplacement de valeur et suppression dans l’ordre.
2Transformer les données d’un dictionnaire en rapports
12 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionChoisir ce que reçoit chaque boucle
- 2ExempleRecevoir les deux parties d’une paire
- 3Point cléUne vue reste liée au dictionnaire
- 4ExempleTrier selon une valeur stockée
- 5DéfiClasser les noms selon les valeurs
- 6ExempleConstruire un dictionnaire avec une boucle
- 7LienExprimer la même règle de façon concise
- 8ExempleFiltrer d’abord, puis produire la paire
- 9DéfiCombiner un filtre et une transformation
- 10ConseilVérifier les paires avant la construction
- 11DéfiSupprimer les entrées de faible valeur sans perturber la boucle
- 12RécapitulatifAdapter les données d’entrée au résultat
3Construire des effectifs, des groupes et des totaux par catégorie
13 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionLaisser chaque catégorie recueillir un résultat
- 2ExempleDonner son premier effectif à un nouvel élément
- 3ExempleUtiliser zéro pour un élément pas encore rencontré
- 4DéfiTrouver pourquoi un effectif n’augmente jamais
- 5ConseilNettoyer avant de choisir la clé
- 6ExplicationConserver les membres de chaque groupe
- 7ExempleSuivre une mise à jour dont la valeur est une liste
- 8Point cléChaque groupe a besoin d’une liste distincte
- 9DéfiPrévoir la création automatique d’un groupe
- 10ExempleAdditionner des montants plutôt que des occurrences
- 11ExempleCalculer la moyenne des valeurs de chaque groupe
- 12DéfiChoisir la contribution de chaque enregistrement
- 13RécapitulatifConserver le résultat entre les passages
4Lire et résumer des enregistrements imbriqués
11 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDistinguer les identifiants des enregistrements et les champs
- 2ExempleSuivre le chemin jusqu’à une note
- 3DéfiAjouter un champ à un nouvel enregistrement
- 4Point cléCopier l’extérieur peut laisser l’intérieur partagé
- 5DéfiGarder les notes d’essai indépendantes
- 6ExempleCalculer une moyenne par enregistrement
- 7ConseilTraiter un enregistrement sans notes
- 8LienLire les champs au niveau de l’enregistrement
- 9ExempleParcourir toutes les notes des enregistrements
- 10DéfiCombiner un champ et une liste stockée
- 11RécapitulatifGarder chaque niveau visible
5Comparer les appartenances et choisir des collections
15 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDéterminer qui appartient à chaque collection
- 2ExplicationConstruire une collection d’éléments uniques
- 3ConseilAjouter et supprimer l’élément voulu
- 4ExempleConserver les premières apparitions
- 5DéfiConserver l’ordre d’origine des noms distincts
- 6ExempleTrouver tous les étudiants ou seulement les étudiants communs
- 7ExempleLire la différence de gauche à droite
- 8DéfiTrouver les personnes inscrites à un seul club
- 9ExplicationVérifier chaque exigence
- 10Point cléDistinguer un résultat d’un ensemble modifié
- 11LienConserver l’historique, l’identité et l’appartenance
- 12ExempleComparer les clés sans comparer les quantités
- 13DéfiChoisir une collection pour un journal qui s’allonge
- 14DéfiCombiner les vues de clés et la recherche d’un enregistrement manquant
- 15RécapitulatifChoisir d’abord la question d’appartenance
Dictionnaires Python : QCM
Série 1 : Lire et modifier des collections Python10 Questions Pratiques
Question 1 sur 10
{"oak": 4, "pine": 7, "oak": 9} ?Afficher la réponseMasquer la réponse
"oak" conserve sa dernière valeur, 9 : le dictionnaire contient donc les deux clés "oak" et "pine". Compter les trois paires écrites ne tient pas compte du remplacement : un dictionnaire ne peut pas contenir deux entrées distinctes sous la même clé. Le nombre d’éléments est le nombre de clés distinctes.Question 2 sur 10
levels = {"east": 0, "west": 5}, que renvoie "east" in levels ?Afficher la réponseMasquer la réponse
"east" est une clé, et elle est présente avec une valeur stockée égale à zéro. Une valeur nulle rend faux un test de sa valeur de vérité, mais ne supprime pas la clé. Le résultat de in est un booléen, pas la valeur stockée sous la clé.Question 3 sur 10
Qu’affiche ce code ?
seats = {"front": 6, "back": 8}
removed = seats.pop("front")
seats["back"] -= 2
print(removed, seats["back"])
Afficher la réponseMasquer la réponse
pop("front") supprime la paire et renvoie sa valeur : removed devient donc 6. Le nombre de places arrière restantes passe de 8 à 6. Considérer que pop renvoie None revient à le confondre avec des méthodes comme clear, qui modifient une collection sans renvoyer d’élément.Question 4 sur 10
sum({"small": 3, "large": 9}.values()) ?Afficher la réponseMasquer la réponse
3 et 9, et sum les additionne pour donner 12. Les deux paires clé-valeur ne donnent pas une somme de 2 ; ce serait la longueur du dictionnaire. L’appel à .values() sélectionne les quantités nécessaires au calcul.Question 5 sur 10
{name: len(name) for name in ["elm", "cedar"]} crée-t-il ?Afficher la réponseMasquer la réponse
len(name) fournit la valeur correspondante : 3 pour "elm" et 5 pour "cedar". Inverser les paires exigerait de placer l’expression de la longueur avant les deux-points et celle du nom après.Question 6 sur 10
Quelle est la valeur de counts["up"] après cette boucle ?
counts = {}
for move in ["up", "left", "up", "up"]:
counts[move] = counts.get(move, 0) + 1
Afficher la réponseMasquer la réponse
"up" stocke 1, le deuxième porte cette valeur à 2 et le troisième la porte à 3. L’entrée "left" a son propre compteur et n’augmente pas celui de "up". Compter les quatre passages de la boucle donnerait le nombre total de déplacements, pas la fréquence de ce déplacement précis.Question 7 sur 10
Que vaut groups["r"] après ce code ?
groups = {}
for word in ["rose", "mint", "reed"]:
groups.setdefault(word[0], []).append(word)
Afficher la réponseMasquer la réponse
"r" et y ajoute "rose" ; "reed" rejoint ensuite cette même liste. Le groupe "m" contient "mint" séparément. setdefault conserve une liste existante : il ne la remplace donc pas par une nouvelle liste vide au dernier passage.Question 8 sur 10
devices = {"d7": {"ports": [2, 4, 8]}}, que renvoie devices["d7"]["ports"][-1] ?Afficher la réponseMasquer la réponse
[-1] sélectionne le dernier élément de la liste, 8. Une clé de dictionnaire et un indice de liste jouent des rôles différents dans la chaîne. La longueur de la liste est 3, mais l’expression demande un élément, pas sa longueur.Question 9 sur 10
len(set([8, 2, 8, 5, 2])) ?Afficher la réponseMasquer la réponse
8, 2 et 5. Les apparitions répétées ne créent pas de nouveaux éléments : la longueur est donc 3. La liste d’entrée a cinq positions, mais sa conversion en ensemble élimine les occurrences supplémentaires avant l’évaluation de len.Question 10 sur 10
{"read", "write"}. Un compte possède {"read", "share"} et une nouvelle attribution ajoute {"write"}. Quelle expression vérifie si le compte satisfait toutes les exigences après cette attribution ?Afficher la réponseMasquer la réponse
Série 2 : Suivre les accès, les groupes et les enregistrements10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
rates = {"basic": 7} et result = rates.get("plus", 0), que valent result et len(rates) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Qu’affiche ce code ?
settings = {"sound": 2, "light": 4}
settings.update({"sound": 5})
del settings["sound"]
settings["sound"] = 1
print(list(settings))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
wait = {"A": 9, "B": 3, "C": 6}, que renvoie sorted(wait, key=wait.get) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Qu’affiche ce code ?
from collections import Counter
counts = Counter([4, 4, 7])
print(counts[9])
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Qu’affiche ce code ?
groups = dict.fromkeys(["indoor", "outdoor"], [])
groups["indoor"].append(12)
groups["outdoor"].append(18)
print(groups["indoor"])
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Qu’affiche ce code ?
original = {"r1": {"visits": 2}}
backup = original.copy()
backup["r1"]["visits"] += 3
backup["r2"] = {"visits": 1}
print(original["r1"]["visits"], "r2" in original)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
{"scores": []}. Quelle condition doit protéger sum(scores) / len(scores) après scores = record["scores"] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
"paused" de states tout en acceptant son absence ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
morning = {"Ivo", "June", "Kai"} et evening = {"June", "Mina"}, quels sont les membres de morning ^ evening ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 3 : Déboguer les transformations de collections10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
len({1: "first", True: "second", "1": "third"}) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
"missing" lorsque la clé du produit est absente. Quel corps de fonction satisfait cette exigence ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Quel dictionnaire reste après cette inversion ?
team = {"Luz": "design", "Omar": "support", "Pia": "design"}
by_role = {role: name for name, role in team.items()}
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
"Go go! Stop." avec lower().split() et word.strip(".,!?"), quel est l’effectif de "go" ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
[("repair", 14), ("delivery", 6), ("repair", 9)]. Avec totals[category] = totals.get(category, 0) + amount, que vaut totals["repair"] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
records.get("x9", {}).get("email", "none") lorsque "x9" est absent ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Qu’affiche ce code ?
records = {"a": {"scores": [6, 9]}, "b": {"scores": [8]},
"c": {"scores": []}}
count = 0
for info in records.values():
for score in info["scores"]:
if score >= 8:
count += 1
print(count)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
list(dict.fromkeys(["z", "m", "z", "a"])) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
{2, 5} < {2, 5} ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Qu’affiche ce code ?
first = {"lamp": 4, "cord": 9, "plug": 2}
second = {"cord": 3, "plug": 8, "case": 5}
result = {name: first[name]
for name in first.keys() & second.keys()
if first[name] < second[name]}
print(sorted(result.items()))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 4 : Combiner les compétences sur les collections10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Qu’affiche ce code ?
stock = {"bolts": 0}
first = stock.get("nuts", 4)
second = stock.setdefault("nuts", 6)
print(first, second, len(stock))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Qu’affiche ce code ?
base = {"size": 2, "mode": 1}
alias = base
merged = base | {"size": 5}
alias["mode"] = 3
print(merged["size"], merged["mode"], base["size"])
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Qu’affiche ce code ?
levels = {"low": 2, "high": 8, "mid": 5}
view = levels.keys()
for name in list(levels):
if levels[name] < 5:
del levels[name]
print(list(view))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Que produit ce code ?
names = ["Rae", "Sol", "Tia"]
scores = [7, 9]
result = {name: score * 2 for name, score in zip(names, scores)
if score >= 8}
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Qu’affiche ce code ?
from collections import defaultdict
groups = defaultdict(list)
groups["red"].append(5)
unused = groups["blue"]
print(len(groups), len(unused))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Quelle moyenne globale ces données donnent-elles lorsque chaque score a le même poids ?
records = {"p": {"scores": [10, 20]},
"q": {"scores": [90]}, "r": {"scores": []}}
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Qu’affiche ce code ?
records = {"v1": {"team": "north", "scores": [2, 6]},
"v2": {"team": "south", "scores": []},
"v3": {"team": "north", "scores": [4]}}
totals = {}
for info in records.values():
team = info["team"]
for score in info["scores"]:
totals[team] = totals.get(team, 0) + score
print(totals.get("south", 0), totals["north"])
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Qu’affiche ce code ?
required = {"a", "b", "c"}
current = {"a", "d"}
missing = required - current
current |= {"b"}
print(sorted(missing), sorted(required - current))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Qu’affiche ce code ?
left = {"x": 2, "y": 4}
right = {"y": 4, "x": 2}
print(left == right, list(left) == list(right))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Tu bloques sur ton propre exercice ? Aide aux Devoirs
Mots-Clés
A
accès en chaîne
devices["d7"]["ports"][0] atteint un enregistrement, sa liste de ports, puis le premier port.accès par clé
prices["juice"] permet de retrouver le prix stocké, à condition que le dictionnaire possède une clé "juice".accumulateur
B
boucle imbriquée
C
champ facultatif
get peut donc fournir une valeur de remplacement sans lever KeyError."no email" lorsqu’un enregistrement d’étudiant ne le contient pas.clé
"glue" permet de retrouver la quantité 3 dans un dictionnaire qui stocke les quantités par nom de produit.clé de comparaison
key=, utilisée pour comparer les éléments tout en conservant les éléments d’origine comme résultats.sorted(wait, key=wait.get), chaque temps d’attente stocké est la clé de comparaison associée au nom de sa station.copie profonde
copie superficielle
Counter
"level" enregistre deux occurrences de "l", deux de "e" et une de "v".D
dédoublonnage
list(dict.fromkeys(items)) conserve les éléments hachables dans l’ordre de leur première apparition.defaultdict
list crée une liste vide distincte lors de la première lecture de chaque nouvelle clé de groupe.dépaquetage de tuple
for name, score in scores.items(): rend les deux parties disponibles dans le corps de la boucle.dictionnaire
{"tape": 8, "glue": 3}.dictionnaire en compréhension
{word: len(word) for word in words} stocke une longueur sous chaque mot.dictionnaire imbriqué
students["ana"]["major"] de lire un champ de l’enregistrement d’Ana.différence
a - b contient les membres de l’ensemble de gauche absents de l’ensemble de droite ; l’ordre des opérandes compte donc.required - skills trouve les compétences exigées qui manquent au candidat, pas ses compétences supplémentaires.différence symétrique
E
enregistrement
ensemble
ensembles disjoints
a.isdisjoint(b) renvoie True.É
égalité de collections
{"a": 1, "b": 2} est égal aux mêmes paires insérées dans l’ordre inverse.élément
3 apparaît une fois dans set([3, 3, 5]), donc l’ensemble obtenu ne contient que deux membres.F
fabrique par défaut
defaultdict appelle sans argument pour créer une valeur lors de l’accès à une clé manquante.list crée une nouvelle liste vide pour chaque nouvelle clé dans defaultdict(list).filtre
if finale d’une compréhension détermine quelles entrées produisent des paires.if quantity > 0 écarte les produits dont le stock est nul lors de la construction d’un nouveau dictionnaire.fonction zip
frozenset
fusion
a | b, les clés communes prennent leurs valeurs dans b et les deux entrées restent inchangées.defaults | overrides permet à une valeur de remplacement d’écraser une valeur par défaut pour un même paramètre.G
garde contre la liste vide
if scores: empêche un enregistrement sans scores de provoquer une division par zéro.H
hachable
(4, 7) est hachable et peut désigner une position dans une grille, contrairement à la liste [4, 7].I
initialisation
counts = {} à l’intérieur de la boucle effacerait les effectifs recueillis lors des passages précédents.intersection
intersection de vues de clés
& aux vues de clés de dictionnaires et renvoie les clés présentes dans les deux dictionnaires sans comparer leurs valeurs.inversion
itération
{"west": 4, "east": 9} parcourt "west" puis "east", pas les quantités stockées.K
KeyError
stock["soap"] lève KeyError si aucune entrée pour le savon n’existe dans le dictionnaire de stock.L
liste
M
méthode discard
blocked.discard(address) accepte sans erreur une adresse déjà débloquée.méthode pop
inventory.pop("pads") utilise pop pour récupérer l’ancienne quantité tout en supprimant ce produit.méthode popitem
"a" puis "b", popitem() renvoie la paire de "b", même si sa valeur est plus petite.méthode setdefault
setdefault crée une liste pour une nouvelle catégorie et conserve la liste d’une catégorie existante.mise à jour
stock.update({"soap": 6}) effectue une mise à jour et renvoie None, pas le dictionnaire mis à jour.mutation
stock["soap"] = 6 est une mutation visible par tout autre nom désignant ce dictionnaire.N
nombre de valeurs distinctes
len(set(items)) lorsque les éléments d’entrée sont hachables.[7, 7, 2, 7] est deux, tandis que son nombre total d’occurrences est quatre.normalisation du texte
"Map" et "map" en mettant les deux en minuscules.O
ordre d’insertion
"west" reste avant "east" si cette clé a été ajoutée en premier, même si sa valeur change.P
paire clé-valeur
"room": 12 associe le nom de champ "room" au nombre 12.R
rapport formaté
f"{name}: {average:.1f}" pour afficher un identifiant et sa moyenne arrondie.regroupement
"map" et "memo" dans la même liste "m".S
sous-ensemble
<= permet que les deux ensembles soient égaux.required <= skills ne réussit que si le candidat possède chaque compétence exigée.sous-ensemble strict
{2} < {2, 4} est vrai, tandis que {2} < {2} est faux car les ensembles sont égaux.sur-ensemble
a >= b vérifie si a contient tous les membres de b, en permettant l’égalité.skills >= required vérifie si le candidat possède toutes les compétences exigées.T
tableau des effectifs
[2, 5, 2] stocke un effectif de deux sous 2 et de un sous 5.test d’appartenance
in ou not in pour déterminer si une collection contient un élément ; sur un dictionnaire, il vérifie les clés."soap" in stock reste vrai lorsque la quantité de savon stockée est nulle.total par catégorie
tuple
("Dune", 1965) conserve ensemble un titre et son année de publication sous forme de paire.U
union
morning | evening réunit toutes les personnes qui assistent à l’une ou l’autre séance, y compris celles qui assistent aux deux.V
valeur
"scores" peut être une liste, ce qui permet à un enregistrement de contenir tous les scores d’un apprenant.valeur mutable partagée
dict.fromkeys(keys, []), qui place une même liste sous chaque clé de groupe.valeur par défaut
get d’un dictionnaire.stock.get("soap", 0), la valeur par défaut est zéro ; l’appel ne crée pas d’entrée pour le savon.vue de dictionnaire
keys(), values() ou items(), qui reflète les modifications du dictionnaire.stock.keys() montre un nouveau produit après son ajout.vue items
for city, temp in temps.items(): fournit chaque ville avec sa température.À propos de cette unité
Crée ton propre Matériel d'Étude
Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.