Les dictionnaires et les ensembles en Python

Découvre comment les dictionnaires Python stockent des valeurs sous des clés, pour retrouver des données par leur nom, compter les occurrences, regrouper des éléments par catégorie et organiser des enregistrements à l’intérieur d’autres enregistrements. Utilise ensuite les ensembles pour supprimer les doublons et comparer des collections par union, intersection et différence, et apprends quand choisir un dictionnaire, un ensemble, une liste ou un tuple.

DébutantUnité 7 sur 10 de la formation Formation : Python : variables, boucles, fonctions et fichiers

Ce que tu vas apprendre

  1. 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é-valeur
      Dé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 in et utiliser get() pour fournir une valeur par défaut au lieu d’interrompre le programme lorsqu’une clé manque.
    • Ajouter, modifier et supprimer des entrées
      Insé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.
  2. 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 paires
      Utiliser des boucles for avec 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 existantes
      Cré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.
  3. 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 occurrences
      Construire 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 Counter comme un raccourci.
    • Regrouper des éléments et totaliser des valeurs par catégorie
      Rassembler 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.
  4. 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éder
      Construire 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ées
      Utiliser 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.
  5. 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 ensemblistes
      Utiliser 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âche
      Comparer 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.

Dictionnaires Python : cours

5 chapitres

1

Stocker 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 programmeForme 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ève KeyError lorsque la clé manque.
  • in teste les clés, y compris celles dont les valeurs sont nulles ou vides.
  • get renvoie 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érationEffet 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] = value ajoute une clé ou remplace sa valeur.
  • Lors d’une fusion de dictionnaires, la valeur de droite l’emporte pour une clé commune.
  • pop renvoie une valeur supprimée ; popitem renvoie la dernière paire insérée.
  • update et clear renvoient None.
  • setdefault n’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.
2

Parcourir 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 boucleCe 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.get compare 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 if filtre ; les expressions de la paire peuvent transformer les données.
  • zip s’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.
3

Compter 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) + 1 traite 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.get pour classer les éléments.
  • Counter calcule 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.
  • setdefault et defaultdict(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.
4

Modé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 get sur 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.
5

Utiliser 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érationEffet
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.
  • remove lève une erreur en cas d’absence ; discard accepte 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"}
ExpressionRègle d’appartenanceMembres, par ordre alphabétique
`pythonsql`Dans l’un ou l’autre ensemble, ou les deux
python & sqlDans les deux ensemblesBen, Dev
python - sqlDans Python mais pas dans SQLAna, Cara
python ^ sqlDans un seul des ensemblesAna, 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 - b ne conserve que les membres de a absents de b.
  • <= accepte des ensembles égaux ; < exige un sous-ensemble strict.
  • isdisjoint vé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
TypeMode d’accès aux donnéesOrdre et répétitionsLa collection peut-elle être modifiée ?
ListePar positionOrdonnée ; répétitions autoriséesOui
TuplePar positionOrdonné ; répétitions autoriséesNon
DictionnairePar cléOrdre d’insertion ; clés uniquesOui
EnsemblePar appartenanceAucun ordre garanti ; éléments uniquesOui

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

5 Leçons Interactives

1

Construire et tenir à jour un dictionnaire de stock

14 étapes
Créer des paires clé-valeur, choisir des accès sans risque et suivre les modifications et les fusions d’un stock.
  1. 1
    IntroductionTrouver 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.

  2. 2
    ExempleÉ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"] lit 10 ; len(stock) vaut 2, 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.

  3. 3
    ExplicationChoisir 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.

  4. 4
    Dé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 2 et la valeur des stylos est 7. 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.

  5. 5
    ExplicationDéterminer ce que signifie l’absence

    stock["clips"] lève KeyError car 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.

  6. 6
    Point cléUn zéro stocké possède toujours une clé

    Supposons que stock["pads"] = 0 indique que les blocs-notes sont épuisés. "pads" in stock vaut toujours True, 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 renvoie None. Lorsque la question est de savoir si un enregistrement existe, teste la clé avec in.

  7. 7
    Dé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 lire stock[item] ?

    ---reveal---

    Utilise if item in stock:. Les blocs-notes satisfont ce test et leur quantité affichée est zéro. Dans la branche else, affiche "missing". Un test de la valeur de vérité de la quantité renvoyée traiterait à tort l’enregistrement du produit épuisé comme absent.

  8. 8
    ExempleAppliquer une vente et une livraison

    Commence avec un nouveau stock :

    stock = {"pens": 10, "pads": 4}
    stock["pens"] -= 3
    stock["clips"] = 50
    

    La vente lit l’ancienne quantité de stylos et stocke 7. La livraison crée une nouvelle clé pour les trombones avec la valeur 50. 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éthode append.

  9. 9
    ExempleRécupérer une quantité retirée

    Continue avec le stock :

    removed = stock.pop("pads")
    

    removed devient 4 et le dictionnaire devient {"pens": 7, "clips": 50}. pop modifie 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èvent KeyError en cas d’absence, sauf si pop reçoit une valeur par défaut, comme dans stock.pop("pads", 0).

  10. 10
    DéfiTraiter une deuxième suppression

    Le stock actuel est {"pens": 7, "clips": 50}. Que renvoie stock.pop("pads", 0) et que devient le stock ?

    ---reveal---

    L’appel renvoie 0 et 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.

  11. 11
    ExplicationFusionner des paramètres sans perdre la base

    Pour deux dictionnaires, base | overrides cré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}
    

    result a une taille de 5 et une couleur "blue" ; base a toujours une taille de 2. Cet opérateur est disponible depuis Python 3.9. base.update(overrides) modifierait plutôt la base et renverrait None.

  12. 12
    ConseilSuivre 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() et clear() renvoient None, tandis que pop() renvoie une valeur. N’affecte pas le résultat d’une mise à jour au nom dont tu as besoin pour le dictionnaire.

  13. 13
    DéfiUtiliser une valeur par défaut sans écraser

    Un programme commence avec stock = {"pens": 7}. Il appelle stock.get("clips", 20), puis stock.setdefault("clips", 5), puis ajoute 2 à stock["clips"]. Quelle est la quantité finale de trombones ?

    ---reveal---

    Elle est de 7. get renvoie 20 mais n’insère rien. setdefault crée ensuite l’entrée des trombones avec 5, et la dernière mise à jour ajoute 2. 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.

  14. 14
    Ré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, in pour l’existence et get pour 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.

2

Transformer les données d’un dictionnaire en rapports

12 étapes
Choisir les entrées des boucles, trier par clé ou par valeur et construire des dictionnaires filtrés ou transformés.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionChoisir ce que reçoit chaque boucle
  2. 2
    ExempleRecevoir les deux parties d’une paire
  3. 3
    Point cléUne vue reste liée au dictionnaire
  4. 4
    ExempleTrier selon une valeur stockée
  5. 5
    DéfiClasser les noms selon les valeurs
  6. 6
    ExempleConstruire un dictionnaire avec une boucle
  7. 7
    LienExprimer la même règle de façon concise
  8. 8
    ExempleFiltrer d’abord, puis produire la paire
  9. 9
    DéfiCombiner un filtre et une transformation
  10. 10
    ConseilVérifier les paires avant la construction
  11. 11
    DéfiSupprimer les entrées de faible valeur sans perturber la boucle
  12. 12
    RécapitulatifAdapter les données d’entrée au résultat
3

Construire des effectifs, des groupes et des totaux par catégorie

13 étapes
Suivre les premières occurrences, conserver les membres des groupes et calculer des résultats pour chaque catégorie.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionLaisser chaque catégorie recueillir un résultat
  2. 2
    ExempleDonner son premier effectif à un nouvel élément
  3. 3
    ExempleUtiliser zéro pour un élément pas encore rencontré
  4. 4
    DéfiTrouver pourquoi un effectif n’augmente jamais
  5. 5
    ConseilNettoyer avant de choisir la clé
  6. 6
    ExplicationConserver les membres de chaque groupe
  7. 7
    ExempleSuivre une mise à jour dont la valeur est une liste
  8. 8
    Point cléChaque groupe a besoin d’une liste distincte
  9. 9
    DéfiPrévoir la création automatique d’un groupe
  10. 10
    ExempleAdditionner des montants plutôt que des occurrences
  11. 11
    ExempleCalculer la moyenne des valeurs de chaque groupe
  12. 12
    DéfiChoisir la contribution de chaque enregistrement
  13. 13
    RécapitulatifConserver le résultat entre les passages
4

Lire et résumer des enregistrements imbriqués

11 étapes
Suivre des accès en chaîne, copier les enregistrements en connaissance de cause et produire des rapports à partir de listes stockées.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDistinguer les identifiants des enregistrements et les champs
  2. 2
    ExempleSuivre le chemin jusqu’à une note
  3. 3
    DéfiAjouter un champ à un nouvel enregistrement
  4. 4
    Point cléCopier l’extérieur peut laisser l’intérieur partagé
  5. 5
    DéfiGarder les notes d’essai indépendantes
  6. 6
    ExempleCalculer une moyenne par enregistrement
  7. 7
    ConseilTraiter un enregistrement sans notes
  8. 8
    LienLire les champs au niveau de l’enregistrement
  9. 9
    ExempleParcourir toutes les notes des enregistrements
  10. 10
    DéfiCombiner un champ et une liste stockée
  11. 11
    RécapitulatifGarder chaque niveau visible
5

Comparer les appartenances et choisir des collections

15 étapes
Supprimer les répétitions, utiliser les opérations ensemblistes et combiner des ensembles avec des enregistrements et des séquences ordonnées.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDéterminer qui appartient à chaque collection
  2. 2
    ExplicationConstruire une collection d’éléments uniques
  3. 3
    ConseilAjouter et supprimer l’élément voulu
  4. 4
    ExempleConserver les premières apparitions
  5. 5
    DéfiConserver l’ordre d’origine des noms distincts
  6. 6
    ExempleTrouver tous les étudiants ou seulement les étudiants communs
  7. 7
    ExempleLire la différence de gauche à droite
  8. 8
    DéfiTrouver les personnes inscrites à un seul club
  9. 9
    ExplicationVérifier chaque exigence
  10. 10
    Point cléDistinguer un résultat d’un ensemble modifié
  11. 11
    LienConserver l’historique, l’identité et l’appartenance
  12. 12
    ExempleComparer les clés sans comparer les quantités
  13. 13
    DéfiChoisir une collection pour un journal qui s’allonge
  14. 14
    DéfiCombiner les vues de clés et la recherche d’un enregistrement manquant
  15. 15
    RécapitulatifChoisir d’abord la question d’appartenance

Dictionnaires Python : QCM

40 Questions Pratiques en 4 séries

Série 1 : Lire et modifier des collections Python10 Questions Pratiques

Question 1 sur 10

Combien d’éléments contient {"oak": 4, "pine": 7, "oak": 9} ?
  1. 3
  2. 2
  3. 4
  4. 6
Afficher la réponseMasquer la réponse
Réponse : B
La clé répétée "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

Pour levels = {"east": 0, "west": 5}, que renvoie "east" in levels ?
  1. False
  2. 0
  3. None
  4. True
Afficher la réponseMasquer la réponse
Réponse : D
Le test d’appartenance vérifie si "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"])
  1. 6 6
  2. 6 8
  3. None 6
  4. 0 6
Afficher la réponseMasquer la réponse
Réponse : A
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

Que renvoie sum({"small": 3, "large": 9}.values()) ?
  1. 2
  2. 9
  3. 12
  4. 6
Afficher la réponseMasquer la réponse
Réponse : C
La vue de valeurs fournit les nombres 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

Quel dictionnaire {name: len(name) for name in ["elm", "cedar"]} crée-t-il ?
  1. {3: 'elm', 5: 'cedar'}
  2. {'elm': 5, 'cedar': 3}
  3. {'elm': 3, 'cedar': 5}
  4. {'elm': 1, 'cedar': 1}
Afficher la réponseMasquer la réponse
Réponse : C
L’expression avant les deux-points fournit chaque clé : les noms restent donc des clés. 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
  1. 3
  2. 1
  3. 2
  4. 4
Afficher la réponseMasquer la réponse
Réponse : A
Le premier "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)
  1. ['reed']
  2. ['rose', 'mint', 'reed']
  3. ['r', 'r']
  4. ['rose', 'reed']
Afficher la réponseMasquer la réponse
Réponse : D
Le premier mot crée la liste "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

Pour devices = {"d7": {"ports": [2, 4, 8]}}, que renvoie devices["d7"]["ports"][-1] ?
  1. 2
  2. 8
  3. 4
  4. 3
Afficher la réponseMasquer la réponse
Réponse : B
Le premier accès sélectionne l’enregistrement de l’appareil, le deuxième sélectionne sa liste de ports et [-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

Que renvoie len(set([8, 2, 8, 5, 2])) ?
  1. 2
  2. 4
  3. 3
  4. 5
Afficher la réponseMasquer la réponse
Réponse : C
L’ensemble contient les trois nombres distincts 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

Un service exige {"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 ?
  1. required <= (current | grant)
  2. required <= (current & grant)
  3. required >= (current | grant)
  4. required < (current & grant)
Afficher la réponseMasquer la réponse
Réponse : A
L’union ajoute l’attribution aux autorisations actuelles et produit les autorisations de lecture, de partage et d’écriture. Le test de sous-ensemble vérifie ensuite que chaque autorisation exigée appartient à cet ensemble combiné. L’intersection ne conserverait que les autorisations déjà présentes dans les deux ensembles d’entrée, qui sont disjoints ici : elle éliminerait donc la nouvelle attribution au lieu de l’ajouter.
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

Après rates = {"basic": 7} et result = rates.get("plus", 0), que valent result et len(rates) ?
  1. 0 et 2
  2. None et 1
  3. 0 et 1
  4. 7 et 1
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))
  1. ['light', 'sound']
  2. ['sound', 'light']
  3. ['light']
  4. ['sound', 'light', 'sound']
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Pour wait = {"A": 9, "B": 3, "C": 6}, que renvoie sorted(wait, key=wait.get) ?
  1. ['A', 'B', 'C']
  2. ['B', 'C', 'A']
  3. ['A', 'C', 'B']
  4. [3, 6, 9]
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])
  1. None
  2. 1
  3. KeyError: 9
  4. 0
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"])
  1. [12]
  2. [18]
  3. [[12], [18]]
  4. [12, 18]
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)
  1. 2 False
  2. 5 False
  3. 5 True
  4. 2 True
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un enregistrement contient {"scores": []}. Quelle condition doit protéger sum(scores) / len(scores) après scores = record["scores"] ?
  1. if scores:
  2. if "scores" in record:
  3. if scores is not None:
  4. if len(scores) >= 0:
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Quel appel de méthode supprime "paused" de states tout en acceptant son absence ?
  1. states.remove("paused")
  2. states.pop("paused")
  3. states.discard("paused")
  4. states.clear("paused")
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Pour morning = {"Ivo", "June", "Kai"} et evening = {"June", "Mina"}, quels sont les membres de morning ^ evening ?
  1. Ivo, June, Kai, Mina
  2. Ivo, Kai, Mina
  3. June
  4. Ivo, Kai
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un dispositif de surveillance doit conserver chaque relevé de capteur dans l’ordre d’arrivée, y compris les répétitions, et vérifier séparément si chaque identifiant de capteur est autorisé. Quelle paire de collections convient le mieux ?
  1. Une liste de relevés et un ensemble d’identifiants autorisés.
  2. Un ensemble de relevés et une liste d’identifiants autorisés.
  3. Un dictionnaire dont les clés sont les relevés et un ensemble d’identifiants autorisés.
  4. Un tuple de relevés et un dictionnaire dont les clés sont les relevés.
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

Que vaut len({1: "first", True: "second", "1": "third"}) ?
  1. 1
  2. 3
  3. 6
  4. 2
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un rapport de stock doit afficher une quantité stockée, y compris zéro, ou "missing" lorsque la clé du produit est absente. Quel corps de fonction satisfait cette exigence ?
  1. if stock.get(product):
        return stock[product]
    return "missing"
    
  2. if product in stock:
        return stock[product]
    return "missing"
    
  3. return stock.get(product) or "missing"
    
  4. if product in stock.values():
        return stock[product]
    return "missing"
    
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()}
  1. {'design': 'Pia', 'support': 'Omar'}
  2. {'design': ['Luz', 'Pia'], 'support': ['Omar']}
  3. {'design': 'Luz', 'support': 'Omar'}
  4. {'Luz': 'design', 'Omar': 'support', 'Pia': 'design'}
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Après avoir compté les mots de "Go go! Stop." avec lower().split() et word.strip(".,!?"), quel est l’effectif de "go" ?
  1. 2
  2. 1
  3. 3
  4. 0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une boucle de totalisation traite [("repair", 14), ("delivery", 6), ("repair", 9)]. Avec totals[category] = totals.get(category, 0) + amount, que vaut totals["repair"] ?
  1. 9
  2. 14
  3. 23
  4. 29
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un dictionnaire contient des enregistrements sous forme de valeurs de type dictionnaire. Que renvoie records.get("x9", {}).get("email", "none") lorsque "x9" est absent ?
  1. {}
  2. None
  3. KeyError: 'x9'
  4. "none"
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)
  1. 0
  2. 1
  3. 2
  4. 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Que renvoie list(dict.fromkeys(["z", "m", "z", "a"])) ?
  1. ['a', 'm', 'z']
  2. ['z', 'm', 'a']
  3. ['z', 'm', 'z', 'a']
  4. ['m', 'z', 'a']
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Que renvoie {2, 5} < {2, 5} ?
  1. True
  2. False
  3. set()
  4. None
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()))
  1. [('cord', 9)]
  2. [('plug', 8)]
  3. [('cord', 9), ('plug', 2)]
  4. [('plug', 2)]
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

Une grille stocke des valeurs par couples de coordonnées. Quelle clé Python peut-il accepter directement ?
  1. [3, 5]
  2. (3, 5)
  3. {3, 5}
  4. {"x": 3, "y": 5}
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))
  1. 4 4 2
  2. 4 6 1
  3. 4 6 2
  4. 6 6 2
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"])
  1. 5 3 5
  2. 5 3 2
  3. 2 1 2
  4. 5 1 2
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))
  1. ['low', 'high', 'mid']
  2. ['high', 'mid']
  3. ['mid', 'high']
  4. ['low']
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}
  1. {'Sol': 18}
  2. {'Rae': 14, 'Sol': 18}
  3. {'Sol': 9}
  4. {'Sol': 18, 'Tia': 18}
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))
  1. 1 0
  2. 2 1
  3. 1 1
  4. 2 0
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": []}}
  1. 40.0
  2. 52.5
  3. 60.0
  4. 30.0
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"])
  1. 0 4
  2. 1 12
  3. 0 12
  4. 0 8
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))
  1. ['c'] ['c']
  2. ['b', 'c'] ['b', 'c']
  3. ['b', 'c'] ['c']
  4. ['d'] ['c']
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))
  1. True False
  2. True True
  3. False True
  4. False False
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

62 Mots-Clés, chacun avec sa définition

A

accès en chaîne
Un accès en chaîne applique plusieurs accès successifs, chacun à l’objet renvoyé par l’accès précédent au dictionnaire ou à la liste.
L’accès en chaîne devices["d7"]["ports"][0] atteint un enregistrement, sa liste de ports, puis le premier port.
accès par clé
Un accès par clé dans un dictionnaire utilise une clé pour retrouver sa valeur associée ; l’accès par crochets lève une erreur lorsque cette clé est absente.
L’accès par clé prices["juice"] permet de retrouver le prix stocké, à condition que le dictionnaire possède une clé "juice".
accumulateur
Un accumulateur est une variable qui recueille un résultat au fil des passages d’une boucle, comme un total cumulé ou un décompte des entrées qui satisfont une condition.
Un accumulateur initialisé avant la boucle sur les notes peut compter tous les étudiants qui atteignent la note requise.

B

boucle imbriquée
Une boucle imbriquée exécute une boucle interne à chaque passage d’une boucle externe, par exemple pour parcourir chaque score dans chaque enregistrement.
Une boucle imbriquée sur les étudiants et leurs notes peut compter les notes qui satisfont une condition dans toute la classe.

C

champ facultatif
Un champ facultatif peut être absent de certains enregistrements ; sa lecture avec get peut donc fournir une valeur de remplacement sans lever KeyError.
Un champ facultatif de courriel peut être affiché sous la forme "no email" lorsqu’un enregistrement d’étudiant ne le contient pas.
clé
Une clé désigne une valeur dans un dictionnaire ; son utilisation permet de retrouver cette valeur sans dépendre de la position de la paire.
La clé "glue" permet de retrouver la quantité 3 dans un dictionnaire qui stocke les quantités par nom de produit.
clé de comparaison
Une clé de comparaison est la valeur produite par la fonction passée à key=, utilisée pour comparer les éléments tout en conservant les éléments d’origine comme résultats.
Avec sorted(wait, key=wait.get), chaque temps d’attente stocké est la clé de comparaison associée au nom de sa station.
copie profonde
Une copie profonde copie récursivement les collections imbriquées, créant des dictionnaires et des listes distincts qui peuvent être modifiés indépendamment de l’original.
Une copie profonde permet à un programme d’essayer de nouveaux scores dans un enregistrement copié sans modifier la liste de scores d’origine.
copie superficielle
Une copie superficielle crée une collection externe distincte tout en réutilisant les références aux objets internes de la collection d’origine.
Une copie superficielle d’enregistrements d’étudiants partage toujours chaque dictionnaire d’étudiant : modifier un âge affecte donc les deux collections.
Counter
Un Counter est un type de dictionnaire de la bibliothèque standard destiné à compter des éléments hachables ; il renvoie zéro lors de l’accès à un élément manquant.
Un Counter construit à partir de "level" enregistre deux occurrences de "l", deux de "e" et une de "v".

D

dédoublonnage
Le dédoublonnage supprime les occurrences répétées et laisse un représentant de chaque valeur distincte ; l’ordre n’est conservé qu’avec une méthode appropriée.
Le dédoublonnage avec list(dict.fromkeys(items)) conserve les éléments hachables dans l’ordre de leur première apparition.
defaultdict
Un defaultdict est un type de dictionnaire qui crée et stocke une valeur à partir d’une fabrique fournie lorsqu’une clé manquante est lue avec les crochets.
Un defaultdict créé avec list crée une liste vide distincte lors de la première lecture de chaque nouvelle clé de groupe.
dépaquetage de tuple
Le dépaquetage de tuple affecte les éléments d’un tuple à des noms distincts, comme la clé et la valeur reçues d’un élément de dictionnaire.
Le dépaquetage de tuple dans for name, score in scores.items(): rend les deux parties disponibles dans le corps de la boucle.
dictionnaire
Un dictionnaire est une collection mutable qui associe des clés uniques et hachables à des valeurs et conserve l’ordre d’insertion des clés.
Un dictionnaire peut associer chaque nom de produit à sa quantité actuelle, comme dans {"tape": 8, "glue": 3}.
dictionnaire en compréhension
Un dictionnaire en compréhension construit un nouveau dictionnaire en produisant des paires clé-valeur à partir d’un itérable, avec la possibilité de filtrer les entrées.
Le dictionnaire en compréhension {word: len(word) for word in words} stocke une longueur sous chaque mot.
dictionnaire imbriqué
Un dictionnaire imbriqué contient un autre dictionnaire comme valeur, ce qui permet aux clés externes de désigner les enregistrements et aux clés internes de désigner les champs.
Un dictionnaire imbriqué d’étudiants permet à students["ana"]["major"] de lire un champ de l’enregistrement d’Ana.
différence
La 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.
La différence required - skills trouve les compétences exigées qui manquent au candidat, pas ses compétences supplémentaires.
différence symétrique
La différence symétrique contient les éléments présents dans un seul de deux ensembles, en retirant les membres communs de leur réunion.
La différence symétrique de deux listes d’inscrits à des clubs contient les personnes inscrites à un seul des deux clubs.

E

enregistrement
Un enregistrement stocke des champs liés concernant une même entité, souvent sous forme de dictionnaire dont les clés nomment des champs comme l’âge, la filière ou les scores.
Un enregistrement pour un appareil peut contenir son modèle sous forme de chaîne et ses ports disponibles sous forme de liste.
ensemble
Un ensemble est une collection mutable d’éléments uniques et hachables sans ordre garanti, utilisée pour les tests d’appartenance et les comparaisons de collections.
Un ensemble d’identifiants de livres empruntés indique si un identifiant est présent sans stocker de valeur distincte pour celui-ci.
ensembles disjoints
Des ensembles disjoints n’ont aucun élément commun : leur intersection est donc vide et l’appel à a.isdisjoint(b) renvoie True.
Les ensembles des résultats impairs et pairs d’un lancer de dé sont des ensembles disjoints, car aucun résultat possible n’appartient aux deux.

É

égalité de collections
L’égalité de collections compare les contenus selon le type de collection : les listes exigent le même ordre, tandis que les dictionnaires et les ensembles ignorent l’ordre.
L’égalité de collections fait que {"a": 1, "b": 2} est égal aux mêmes paires insérées dans l’ordre inverse.
élément
Un élément est un membre d’un ensemble ; des valeurs égales comptent comme un même membre même si elles ont été fournies plusieurs fois.
L’é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
Une fabrique par défaut est la fonction qu’un defaultdict appelle sans argument pour créer une valeur lors de l’accès à une clé manquante.
La fabrique par défaut list crée une nouvelle liste vide pour chaque nouvelle clé dans defaultdict(list).
filtre
Un filtre ne conserve que les entrées qui satisfont une condition ; la clause if finale d’une compréhension détermine quelles entrées produisent des paires.
Un filtre comme if quantity > 0 écarte les produits dont le stock est nul lors de la construction d’un nouveau dictionnaire.
fonction zip
La fonction zip associe les éléments correspondants de ses entrées et s’arrête lorsque l’entrée la plus courte n’a plus d’éléments.
Utiliser zip pour associer des noms et des scores omet les noms sans correspondance lorsque la liste des scores est plus courte.
frozenset
Un frozenset est un ensemble immuable dont la hachabilité lui permet de servir de clé de dictionnaire ou d’élément d’un autre ensemble.
Un frozenset peut représenter un groupe fixe de mots-clés lorsque ce groupe entier doit servir de clé de dictionnaire.
fusion
Une fusion de dictionnaires combine des paires dans un même résultat ; avec a | b, les clés communes prennent leurs valeurs dans b et les deux entrées restent inchangées.
La fusion 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
Une garde contre la liste vide vérifie qu’une liste contient des valeurs avant une opération qui en a besoin, comme la division d’une somme par la longueur de la liste.
La garde contre la liste vide if scores: empêche un enregistrement sans scores de provoquer une division par zéro.

H

hachable
Un objet est hachable lorsqu’il peut servir de clé de dictionnaire ou d’élément d’ensemble ; les chaînes de caractères, les nombres et les tuples d’éléments hachables conviennent.
Le tuple (4, 7) est hachable et peut désigner une position dans une grille, contrairement à la liste [4, 7].

I

initialisation
L’initialisation donne à une variable sa valeur de départ avant le traitement, par exemple un dictionnaire vide avant une boucle de comptage.
L’initialisation counts = {} à l’intérieur de la boucle effacerait les effectifs recueillis lors des passages précédents.
intersection
L’intersection de deux ensembles ne contient que les éléments présents dans les deux, à l’exclusion des membres présents dans une seule entrée.
L’intersection des identifiants inscrits et des identifiants ayant payé désigne les personnes qui appartiennent aux deux groupes.
intersection de vues de clés
Une intersection de vues de clés applique & aux vues de clés de dictionnaires et renvoie les clés présentes dans les deux dictionnaires sans comparer leurs valeurs.
Une intersection des vues de clés des dictionnaires de stock de deux magasins trouve les produits vendus par les deux, même si leurs quantités en stock diffèrent.
inversion
L’inversion d’un dictionnaire échange les clés et les valeurs ; elle exige des valeurs hachables et les valeurs répétées deviennent une seule nouvelle clé.
L’inversion de deux noms associés à la même couleur favorite ne conserve que le dernier nom sous cette couleur.
itération
L’itération parcourt les éléments fournis par une collection, un par passage de boucle ; parcourir directement un dictionnaire fournit ses clés.
L’itération sur {"west": 4, "east": 9} parcourt "west" puis "east", pas les quantités stockées.

K

KeyError
Une KeyError est une exception levée lors de l’accès à une clé de dictionnaire manquante ou par certaines opérations de suppression sur des clés ou éléments absents.
L’expression stock["soap"] lève KeyError si aucune entrée pour le savon n’existe dans le dictionnaire de stock.

L

liste
Une liste est une séquence mutable et ordonnée qui accepte les valeurs répétées et permet l’accès aux éléments par leur position.
Une liste d’emprunts conserve deux fois le même identifiant de livre lorsque le livre est emprunté deux fois dans une journée.

M

méthode discard
La méthode discard d’un ensemble supprime un élément indiqué lorsqu’il est présent et laisse l’ensemble inchangé lorsque l’élément est absent.
L’appel à discard avec blocked.discard(address) accepte sans erreur une adresse déjà débloquée.
méthode pop
La méthode pop d’un dictionnaire supprime une clé indiquée et renvoie sa valeur stockée, en utilisant une valeur par défaut fournie si la clé est absente.
L’appel à inventory.pop("pads") utilise pop pour récupérer l’ancienne quantité tout en supprimant ce produit.
méthode popitem
La méthode popitem d’un dictionnaire supprime et renvoie la paire clé-valeur insérée le plus récemment sous forme de tuple à deux éléments.
Après l’ajout des clés "a" puis "b", popitem() renvoie la paire de "b", même si sa valeur est plus petite.
méthode setdefault
La méthode setdefault d’un dictionnaire renvoie une valeur existante ou, si sa clé manque, insère d’abord une valeur par défaut et la renvoie.
Le regroupement avec setdefault crée une liste pour une nouvelle catégorie et conserve la liste d’une catégorie existante.
mise à jour
Une mise à jour copie des paires dans un dictionnaire existant, en ajoutant les nouvelles clés et en remplaçant les valeurs des clés déjà présentes.
L’appel à stock.update({"soap": 6}) effectue une mise à jour et renvoie None, pas le dictionnaire mis à jour.
mutation
Une mutation modifie un objet existant, par exemple en ajoutant une paire à un dictionnaire ou en remplaçant sa valeur, sans créer d’objet de remplacement.
L’affectation stock["soap"] = 6 est une mutation visible par tout autre nom désignant ce dictionnaire.

N

nombre de valeurs distinctes
Le nombre de valeurs distinctes mesure combien de valeurs différentes apparaissent ; on l’obtient avec len(set(items)) lorsque les éléments d’entrée sont hachables.
Le nombre de valeurs distinctes de [7, 7, 2, 7] est deux, tandis que son nombre total d’occurrences est quatre.
normalisation du texte
La normalisation du texte harmonise certaines différences avant le traitement, par exemple en mettant les mots en minuscules pour que la casse ne sépare pas leurs effectifs.
La normalisation du texte peut faire partager une clé de comptage à "Map" et "map" en mettant les deux en minuscules.

O

ordre d’insertion
L’ordre d’insertion est l’ordre dans lequel les clés d’un dictionnaire ont été ajoutées ; il est conservé lors du parcours ou de l’affichage du dictionnaire.
Dans l’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
Une paire clé-valeur est un élément de dictionnaire composé d’une clé unique et de sa valeur associée ; dans un littéral, des deux-points les relient.
La paire clé-valeur "room": 12 associe le nom de champ "room" au nombre 12.

R

rapport formaté
Un rapport formaté présente des données sélectionnées de façon lisible, par exemple une ligne par enregistrement avec une moyenne affichée à une décimale.
Un rapport formaté peut utiliser f"{name}: {average:.1f}" pour afficher un identifiant et sa moyenne arrondie.
regroupement
Le regroupement rassemble des entrées sous des noms de catégories communs, en associant souvent chaque nom à une liste de tous les membres qui lui sont affectés.
Le regroupement des noms de fichiers par première lettre place "map" et "memo" dans la même liste "m".

S

sous-ensemble
Un sous-ensemble a tous ses éléments contenus dans un autre ensemble ; le test <= permet que les deux ensembles soient égaux.
Le test de sous-ensemble required <= skills ne réussit que si le candidat possède chaque compétence exigée.
sous-ensemble strict
Un sous-ensemble strict est un sous-ensemble différent de l’ensemble qui le contient, lequel doit avoir au moins un élément supplémentaire.
Le test de sous-ensemble strict {2} < {2, 4} est vrai, tandis que {2} < {2} est faux car les ensembles sont égaux.
sur-ensemble
Un sur-ensemble contient tous les éléments d’un autre ensemble ; a >= b vérifie si a contient tous les membres de b, en permettant l’égalité.
Le test de sur-ensemble skills >= required vérifie si le candidat possède toutes les compétences exigées.

T

tableau des effectifs
Un tableau des effectifs associe chaque élément distinct à son nombre d’occurrences, souvent à l’aide d’un dictionnaire dont les valeurs sont des effectifs entiers.
Un tableau des effectifs pour les lancers [2, 5, 2] stocke un effectif de deux sous 2 et de un sous 5.
test d’appartenance
Un test d’appartenance utilise in ou not in pour déterminer si une collection contient un élément ; sur un dictionnaire, il vérifie les clés.
Le test d’appartenance "soap" in stock reste vrai lorsque la quantité de savon stockée est nulle.
total par catégorie
Un total par catégorie est la somme des montants associés à un nom de catégorie, construite en ajoutant chaque nouveau montant au total précédent de cette catégorie.
Un total par catégorie pour l’alimentation additionne toutes les dépenses alimentaires, même lorsque des dépenses de transport surviennent entre elles.
tuple
Un tuple est une collection ordonnée à emplacements fixes ; ses éléments ne peuvent pas être remplacés, mais un objet mutable qu’il contient peut encore changer.
Un tuple comme ("Dune", 1965) conserve ensemble un titre et son année de publication sous forme de paire.

U

union
L’union de deux ensembles contient chaque élément présent dans l’un ou l’autre ensemble, ou dans les deux, chaque élément égal n’apparaissant qu’une fois.
L’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
Une valeur de dictionnaire est l’objet stocké sous une clé ; elle peut être un nombre, une chaîne de caractères, une liste, un dictionnaire ou tout autre type.
La valeur sous "scores" peut être une liste, ce qui permet à un enregistrement de contenir tous les scores d’un apprenant.
valeur mutable partagée
Une valeur mutable partagée est un même objet modifiable stocké ou nommé à plusieurs endroits, de sorte qu’une modification par une référence apparaît aussi par les autres.
Une valeur mutable partagée résulte de dict.fromkeys(keys, []), qui place une même liste sous chaque clé de groupe.
valeur par défaut
Une valeur par défaut est une valeur de remplacement fournie lors d’un accès à une clé manquante, comme le deuxième argument de la méthode get d’un dictionnaire.
Dans 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
Une vue de dictionnaire est un objet dynamique renvoyé par keys(), values() ou items(), qui reflète les modifications du dictionnaire.
Une vue de dictionnaire mémorisée à partir de stock.keys() montre un nouveau produit après son ajout.
vue items
La vue items fournit les entrées d’un dictionnaire sous forme de tuples clé-valeur, afin qu’une boucle puisse recevoir les deux parties de chaque paire stockée.
La vue items dans for city, temp in temps.items(): fournit chaque ville avec sa température.

À propos de cette unité

Par StudeliSignaler une erreur

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.

Commencer