Aller au contenu
English

Les collections

  • Leçon 5
  • 40 min
  • Module 2 : Valeurs et flux de contrôle
Leçon 5 sur 18 · Python pour l'ingénierie de l'IA en pratiqueLes collections

Ce que vous saurez faire

Gardez des billets de soutien dans une seule variable, avec un enregistrement par billet, et parcourez-les un à un. Tous les programmes qui traitent des données commencent par cette structure. Cela va du nettoyeur de billets de ce cours aux données d’entraînement d’un modèle.

Carnet JupyterFaites cette leçon dans un carnet JupyterColab · Kaggle · GitHub · en anglais

Le carnet (notebook) Jupyter contient tous les exemples, exercices et vérifications de cette leçon, avec les consignes. Il ne demande aucune installation ni aucun projet local : seulement Python. Lisez les explications ici et exécutez le code dans le carnet.

Le carnet est en anglais. Colab et Kaggle ouvrent votre propre copie. Il faut un compte Google ou Kaggle gratuit. Vous êtes bloqué ? Consultez le carnet de solution.

Avant de commencerCe qu’il faut savoir et avoir sous la mainEnviron 40 minutes

Ce que vous devez savoir

Ce qu’il vous faut sur votre ordinateur (seulement pour travailler localement; le carnet et les zones de cette page n’en ont pas besoin)

Testé avec Python 3.14 (terminal) et Pyodide 314.0 (navigateur). Le carnet a été testé dans Jupyter.

Une collection est une valeur qui contient d’autres valeurs. Python en propose quatre types principaux. Chacun convient à une tâche différente :

Type Exemple Quand l’utiliser
liste ["open", "closed", "open"] L’ordre compte et les éléments peuvent se répéter. Vous pouvez ajouter et retirer des éléments.
tuple ("T-1001", "open") Un petit groupe fixe de valeurs qui vont ensemble. Il ne peut pas changer.
ensemble {"billing", "login"} Vous voulez chaque valeur une seule fois et l’ordre ne compte pas.
dictionnaire {"id": "T-1001", "status": "open"} Vous cherchez une valeur par un nom (une clé).

Dans ce cours, vous utilisez surtout deux types ensemble : une liste de dictionnaires. Chaque dictionnaire représente un billet et la liste contient tous les billets.

Une liste est une suite de valeurs entre crochets. Chaque élément a une position, appelée son indice. Les indices commencent à 0, pas à 1 :

statuses = ["open", "closed", "open", "pending"]
Code Résultat Signification
statuses[0] "open" (ouvert) Le premier élément.
statuses[1] "closed" (fermé) Le deuxième élément.
statuses[-1] "pending" (en attente) Le dernier élément. Les indices négatifs comptent à partir de la fin.
len(statuses) 4 Le nombre d’éléments. Le dernier indice est toujours len - 1.
statuses[1:3] ["closed", "open"] Une tranche : de l’indice 1 jusqu’à l’indice 3, sans inclure ce dernier.
statuses.append("open") (modifie la liste) Ajoute un élément à la fin. Maintenant, len(statuses) vaut 5.

Pourquoi les indices commencent-ils à 0? L’indice compte les éléments qui viennent avant l’élément. Aucun élément ne précède le premier.

Pour faire quelque chose avec chaque élément, utilisez une boucle for :

for status in statuses:
print(status)

Python donne le nom status au premier élément et exécute la ligne en retrait. Ensuite, il donne à status l’élément suivant et exécute la ligne à nouveau, jusqu’à épuiser les éléments. La ligne après for doit être en retrait (quatre espaces), et la ligne for se termine par :. Le retrait indique quelles lignes font partie de la boucle. Vous en apprendrez plus sur les boucles dans la prochaine leçon.

Une liste trouve une valeur par sa position. Un dictionnaire trouve une valeur par une clé : un nom que vous choisissez. Chaque entrée contient une clé et une valeur, séparées par : :

ticket = {"id": "T-1001", "status": "open", "category": "billing", "priority": 2}
Code Résultat Signification
ticket["category"] "billing" (facturation) La valeur associée à la clé "category" (catégorie).
ticket["assignee"] erreur : KeyError: 'assignee' La clé n’existe pas.
ticket.get("assignee") None Comme [ ], mais renvoie None quand la clé n’existe pas.
ticket.get("assignee", "nobody") "nobody" (personne) Renvoie votre valeur par défaut quand la clé n’existe pas.
ticket["status"] = "closed" (modifie le dictionnaire) Modifie une valeur ou ajoute la clé si elle est nouvelle.

Un dictionnaire convient bien à un enregistrement : ses clés sont les noms des champs, donc ticket["priority"] est explicite. Avec une liste, ticket[3] ne l’est pas.

Pour parcourir toutes les clés et leurs valeurs, utilisez une boucle sur .items(). Chaque étape vous donne deux valeurs : une clé et sa valeur.

for key, value in ticket.items():
print(key, "=", value)
Sortie
id = T-1001
status = open
category = billing
priority = 2

Un tuple ressemble à une liste entre parenthèses, mais il ne peut plus changer après sa création. Utilisez-le pour un petit groupe de valeurs qui vont ensemble, comme une paire. Vous pouvez décomposer un tuple en noms distincts sur une seule ligne :

pair = ("T-1001", "open")
ticket_id, status = pair # ticket_id is "T-1001", status is "open"

Un ensemble garde chaque valeur une seule fois. Créez-en un à partir d’une liste pour trouver ses valeurs distinctes. Utilisez in pour vérifier si une valeur s’y trouve :

categories = set(["billing", "login", "billing", "shipping"])
print(categories) # {'billing', 'login', 'shipping'}, in any order
print("login" in categories) # True

Un ensemble n’a pas d’ordre. Il peut donc afficher les éléments dans un ordre différent sur votre ordinateur. Utilisez sorted(categories) quand vous avez besoin d’un ordre fixe. in fonctionne aussi avec les listes, les chaînes et les clés de dictionnaire.

Exemple détaillé : une liste d’enregistrements de billets

Section intitulée « Exemple détaillé : une liste d’enregistrements de billets »

Voici les six billets utilisés dans le reste du module. Lisez le code de l’extérieur vers l’intérieur : une liste ([ ]) contenant six dictionnaires ({ }).

Exécutez du Python dans votre navigateur

Explorez les billets

Avant d’appuyer sur Run (exécuter), prédisez les trois premières lignes de la sortie. Ensuite, exécutez le code et comparez.

tickets[-1]["category"] comporte deux étapes. tickets[-1] donne le dernier dictionnaire. ["category"] récupère ensuite une valeur de ce dictionnaire. Lisez cette expression de gauche à droite.

Exercices guidés : répondre à des questions sur les billets

Section intitulée « Exercices guidés : répondre à des questions sur les billets »

Utilisez les mêmes six billets. Chaque étape demande une valeur. Écrivez le code dans la zone, sous la liste.

  1. Affichez le statut du troisième billet (T-1003). Sortie attendue : open.
  2. Créez un ensemble de toutes les catégories, puis affichez-le en ordre trié. Résultat attendu : ['billing', 'login', 'shipping'].
  3. Vérifiez si un billet appartient à la catégorie "refund" (remboursement). Résultat attendu : False.
  4. Changez le statut du premier billet pour "closed", puis affichez ce billet au complet.

Exécutez du Python dans votre navigateur

Exercices guidés

Les étapes 1 et 2 sont déjà faites. set() crée un ensemble vide et .add() y ajoute une valeur. Faites les étapes 3 et 4 vous-même.

Afficher les réponses aux étapes 3 et 4
# 3. Is there a "refund" ticket?
print("refund" in categories)
# 4. Close the first ticket, then show it.
tickets[0]["status"] = "closed"
print(tickets[0])

Cette partie explique l’une des surprises les plus fréquentes en Python. = ne copie pas une valeur. Il lui donne un autre nom. Regardez ce code :

tickets = ["T-1001", "T-1002"]
backup = tickets
tickets.append("T-1003")
print(backup)

La plupart des gens s’attendent à ce que backup contienne deux éléments. Il en contient trois. Voici l’état après chaque ligne :

Après la ligne tickets désigne backup désigne La liste elle-même
1 liste A (pas encore) A : ["T-1001", "T-1002"]
2 liste A liste A A : ["T-1001", "T-1002"]
3 liste A liste A A : ["T-1001", "T-1002", "T-1003"]

Il n’y a qu’une seule liste. backup = tickets lui a donné un deuxième nom. Une modification faite avec un nom est donc visible avec l’autre. C’est aussi vrai pour les dictionnaires et les ensembles. Ce n’est pas un problème pour les nombres et les chaînes, car ils ne peuvent pas changer. hours = hours + 2 crée un nouveau nombre.

Pour faire une vraie copie, appelez .copy() : backup = tickets.copy(). Maintenant, backup est une nouvelle liste contenant les mêmes éléments, et append ne modifie qu’une des deux listes.

Exécutez du Python dans votre navigateur

Prédisez, puis exécutez

Notez les trois nombres que vous attendez. Ensuite, appuyez sur Run.

Vous avez les six billets dans une liste. Un collègue vous demande des billets par identifiant plusieurs fois par jour. Créez un dictionnaire by_id avec les identifiants des billets comme clés et les enregistrements des billets comme valeurs. Ensuite, by_id["T-1004"]["status"] doit donner "pending".

Exécutez du Python dans votre navigateur

À vous de jouer : construire by_id

Commencez avec un dictionnaire vide et ajoutez une entrée pour chaque billet avec une boucle.

Afficher une réponse
by_id = {}
for ticket in tickets:
by_id[ticket["id"]] = ticket

Chaque étape de la boucle ajoute une clé (l’identifiant du billet) avec l’enregistrement complet comme valeur. Une recherche par clé est rapide, même avec un million de billets. Le dictionnaire ne parcourt pas les éléments un à un.

Erreur courante

IndexError et KeyError

Symptôme : le programme s’arrête avec l’une de ces erreurs :

IndexError: list index out of range
KeyError: 'assignee'

Cause : vous avez demandé un élément qui n’existe pas. IndexError signifie que la position est trop grande. Une liste de 6 éléments a les indices 0 à 5, donc tickets[6] n’existe pas. KeyError signifie que le dictionnaire ne contient pas cette clé. La clé dans le message indique ce que Python cherchait. Vérifiez l’orthographe et les majuscules : "Status" et "status" sont des clés différentes.

Solution :

  1. Affichez ce qui existe : print(len(tickets)) pour une liste, print(ticket.keys()) pour un dictionnaire.
  2. Pour une liste, utilisez un indice inférieur à len(...), ou -1 pour le dernier élément.
  3. Pour une clé de dictionnaire qui peut être absente, utilisez .get("key"). Décidez quoi faire quand le résultat est None.

Vérifiez votre compréhension

Prédisez la sortie : statuses = [« open », « closed »]; same = statuses; same.append(« pending »); print(len(statuses))

Afficher la réponse

3. same = statuses ne copie pas la liste. Les deux noms désignent une seule liste. Ainsi, append utilisé avec same modifie la liste que statuses désigne. Utilisez statuses.copy() quand vous avez besoin d’une liste distincte.

Vérifiez votre compréhension

Quelle collection convient à chaque tâche? (a) Les six billets dans leur ordre d'arrivée. (b) Les catégories distinctes présentes. (c) Les champs d'un billet. (d) L'identifiant d'un billet et son nouveau statut, transmis ensemble.

Afficher la réponse

(a) Une liste : l’ordre compte. (b) Un ensemble : chaque catégorie une seule fois. (c) Un dictionnaire : vous cherchez les champs par leur nom. (d) Un tuple : deux valeurs qui vont ensemble et ne changent pas.

Récapitulatif

  • Une liste garde les éléments en ordre. Les indices commencent à 0, et -1 désigne le dernier élément.
  • Un dictionnaire trouve une valeur par sa clé. Utilisez .get() quand une clé peut être absente.
  • Un tuple est un groupe fixe de valeurs. Un ensemble garde chaque valeur une seule fois, sans ordre.
  • for item in collection: exécute les lignes en retrait une fois pour chaque élément.
  • = donne un autre nom à une valeur. Il ne la copie pas. Utilisez .copy() pour une liste ou un dictionnaire distinct.

Ensuite, vous prenez des décisions avec if et utilisez des boucles pour filtrer les billets et les compter par catégorie.

Leçon suivante : Conditions et répétitions