Séance 06 · Partie A · Python pas à pas
Listes, tuples
et dictionnaires.
Un robot a dix capteurs, mille mesures, une carte de son environnement. Il faut des structures pour ranger tout ça.
Durée : 90 min · Objectifs : créer et modifier des listes, parcourir, trier, chercher ; comprendre les tuples ; associer des clés à des valeurs avec un dictionnaire.
Ce que vous saurez faire à la fin
- Ranger des mesures dans une liste, les parcourir, en extraire des tranches.
- Ajouter, retirer, trier, chercher.
- Expliquer pourquoi modifier une liste dans une fonction modifie l’originale.
- Représenter un robot ou un capteur par un dictionnaire.
01 / Listes
Une liste : des valeurs en ordre, entre crochets
- Positions à partir de 0, comme les chaînes.
- Tranche
[a:b]: de a inclus à b exclu. Commerange. - Une liste est modifiable : on peut remplacer un élément.
- Une liste peut contenir n’importe quoi, y compris d’autres listes.
Pourquoi « b exclu » partout ?
Avec cette convention, len(liste[a:b]) vaut simplement b − a, et liste[:k] + liste[k:] redonne la liste entière sans doublon ni trou. Le mathématicien Dijkstra a écrit une note célèbre pour la justifier. Une fois habitué, vous ne vous tromperez plus jamais de 1.
01 / Listes
Faire grandir et rétrécir une liste
Méthodes et point
trajet.append(x) : la fonction append « appartient » à la liste, on l’appelle avec un point. On dit une méthode. append modifie la liste et ne renvoie rien (None) : trajet = trajet.append(x) est une erreur classique qui remplace votre liste par None. On reviendra sur les méthodes en séance 16 (objets).
01 / Listes
Parcourir : par valeur, par position, ou les deux
Quelle forme choisir ?
Si vous n’avez besoin que des valeurs : for t in liste. Si vous avez besoin de la position (pour modifier, ou comparer avec le voisin) : enumerate. for i in range(len(liste)) est correct mais plus lourd. Et pour parcourir deux listes en parallèle : for a, b in zip(liste1, liste2).
02 / Trier et chercher
Trier, retourner, agréger
Pour aller plus loin
sorted renvoie une copie triée ; .sort() modifie la liste et renvoie None. Le paramètre key reçoit une fonction appliquée à chaque élément pour décider de l’ordre : c’est une fonction passée en argument, comme une valeur. Python trie avec l’algorithme Timsort, en O(n log n) : vous verrez ce que ça signifie en séance 11, et vous écrirez vos propres tris.
02 / Trier et chercher
Chaînes ↔ listes
La compréhension de liste
[int(m) for m in morceaux] se lit « la liste des int(m) pour chaque m dans morceaux ». C’est un raccourci pour une boucle for avec append. On peut filtrer : [v for v in valeurs if v > 20]. Très utilisé en Python ; séance 17 pour le détail. Le format « valeurs séparées par des virgules » est le CSV, celui des tableurs et de beaucoup de capteurs : séance 07.
03 / Références
Attention : deux noms, une seule liste
Vous l’aviez vu en séance 01 : une variable est une étiquette, pas une boîte.
b = ane copie rien.- Une fonction qui reçoit une liste reçoit l’étiquette : elle peut modifier le contenu.
- Ce n’est pas un bug, c’est efficace (pas de copie de 10 millions de mesures). Mais il faut le savoir.
Pour aller plus loin — et pour les nombres ?
Avec x = 5; y = x; y += 1, x reste 5. Non pas parce que les entiers sont copiés, mais parce qu’ils sont immuables : y += 1 crée un nouvel objet 6 et déplace l’étiquette y. Une liste, elle, est mutable : append modifie l’objet existant. Immuable/mutable est la vraie distinction, et elle explique tout. Les chaînes et les tuples sont immuables.
03 / Références
Le tuple : une liste qu’on ne modifie pas
Quand utiliser un tuple ?
Pour un petit groupe de valeurs qui forment un tout (coordonnées, couleur, date), qui ne changera pas. C’est aussi ce que renvoie une fonction avec return x, y. Le fait qu’il soit immuable est une garantie : personne ne pourra le modifier par accident. Et un tuple peut servir de clé de dictionnaire, ce qu’une liste ne peut pas.
04 / Dictionnaires
Un dictionnaire : des clés → des valeurs
- Une liste range par position (0, 1, 2…). Un dictionnaire range par clé (un nom, un numéro, un tuple…).
- Accès instantané par la clé, même avec un million d’entrées.
- Une clé absente avec
[ ]→KeyError. Avec.get()→ valeur par défaut.
04 / Dictionnaires
Parcourir et compter
Décryptage du comptage
compte.get(mot, 0) renvoie le compte actuel, ou 0 si le mot n’a jamais été vu. On ajoute 1 et on range. Trois lignes pour compter n’importe quoi : lettres d’un texte, valeurs d’un capteur, votes. max(compte, key=compte.get) : parmi les clés, celle dont la valeur est la plus grande.
04 / Dictionnaires
Structures imbriquées : modéliser un vrai système
lambda et expression conditionnelle
lambda r: r["batterie"] est une mini-fonction sans nom, écrite sur place : elle reçoit r et renvoie sa batterie. Équivalent de def batterie_de(r): return r["batterie"]. "OK" if cond else "À RECHARGER" est une expression conditionnelle : un if qui vaut quelque chose. Une liste de dictionnaires est la structure la plus courante pour représenter des données réelles (c’est aussi la forme du JSON, séance 07).
05 / Défis
Défi ★ — Statistiques de mesures
Consigne
Écrire statistiques(mesures) qui renvoie un tuple (minimum, maximum, moyenne) sans utiliser min, max ni sum. Puis filtrer(mesures, seuil) qui renvoie une nouvelle liste des mesures supérieures au seuil, sans modifier l’originale.
Correction
def statistiques(mesures):
mini = maxi = mesures[0]
total = 0
for v in mesures:
if v < mini: mini = v
if v > maxi: maxi = v
total += v
return mini, maxi, total / len(mesures)
def filtrer(mesures, seuil):
resultat = []
for v in mesures:
if v > seuil:
resultat.append(v)
return resultat # ou : return [v for v in mesures if v > seuil]05 / Défis
Défi ★★ — L’inventaire
Consigne
Un inventaire est un dictionnaire pièce → quantité. Écrire ajouter(inv, piece, n), retirer(inv, piece, n) (qui refuse si le stock est insuffisant et renvoie un booléen), et rapport(inv) qui affiche les pièces par ordre alphabétique avec leur quantité et signale celles en dessous de 5.
Correction
def ajouter(inv, piece, n):
inv[piece] = inv.get(piece, 0) + n
def retirer(inv, piece, n):
if inv.get(piece, 0) < n:
return False
inv[piece] -= n
return True
def rapport(inv):
for piece in sorted(inv):
alerte = " ⚠ stock faible" if inv[piece] < 5 else ""
print(f"{piece:10} {inv[piece]:4}{alerte}")Les fonctions modifient inv reçu en paramètre : c’est voulu ici (un inventaire partagé). Notez que ajouter ne renvoie rien et que retirer renvoie un booléen que l’appelant peut tester.
05 / Défis
Défi ★★★ — Esprit prépa : le crible d’Ératosthène
Consigne
Pour trouver tous les nombres premiers jusqu’à N : créer une liste de N+1 booléens à True ; pour chaque i de 2 à √N, si i est encore marqué premier, marquer tous ses multiples (2i, 3i, …) comme non premiers. Les positions restées True sont les premiers.
Écrire crible(n) qui renvoie la liste des premiers ≤ n. Compter les premiers jusqu’à 100 000 et mesurer le temps avec time.perf_counter(). Comparer avec la méthode est_premier de la séance 05 appliquée à chaque nombre.
Correction et ouverture
def crible(n):
est_premier = [True] * (n + 1)
est_premier[0] = est_premier[1] = False
for i in range(2, int(n ** 0.5) + 1):
if est_premier[i]:
for multiple in range(i * i, n + 1, i):
est_premier[multiple] = False
return [i for i in range(n + 1) if est_premier[i]]9592 premiers en une fraction de seconde, là où tester chaque nombre un par un prend plusieurs secondes. On commence à i * i car les multiples plus petits ont déjà été barrés par des facteurs plus petits. [True] * (n + 1) crée une liste de n+1 True. Le crible échange de la mémoire (une liste de 100 001 booléens) contre du temps : ce compromis est au cœur de l’algorithmique. Le crible date de 2200 ans et reste la méthode utilisée pour générer des tables de premiers.
06 / Vérification
Après a = [1, 2, 3]; b = a; b.append(4), que vaut a ?
Deux questions supplémentaires
1. Que vaut [1, 2, 3][3] ? IndexError : les positions vont de 0 à 2. C’est l’erreur « off by one » la plus classique.
2. Peut-on utiliser une liste comme clé de dictionnaire ? Non (TypeError: unhashable type) car elle est mutable. Un tuple, oui.
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
Liste [ ] | Séquence ordonnée et modifiable. |
Tuple ( ) | Séquence ordonnée et immuable. |
Dictionnaire { } | Association clé → valeur. |
Tranche [a:b] | Sous-séquence de a inclus à b exclu. |
| Méthode | Fonction attachée à un objet, appelée avec un point. |
| Mutable / immuable | Modifiable sur place / non modifiable. |
| Compréhension | [f(x) for x in seq if cond]. |
Pour continuer
Vous savez organiser des données
Séance suivante : les faire entrer et sortir du programme — chaînes de caractères et fichiers.
À faire chez soi
- Refaire les défis sans la correction.
- Écrire une fonction qui renvoie la liste sans doublons, en conservant l’ordre. Puis chercher ce que fait
set(). - Représenter un plateau de morpion 3×3 par une liste de listes, l’afficher, et écrire
gagnant(plateau).