Vue d'ensemble
Une liste et une chaîne de caractères sont deux séquences : des suites ordonnées de valeurs, où chaque élément est repéré par sa position, appelée indice. La liste range n'importe quoi (nombres, mots, autres listes) et se modifie librement ; la chaîne range du texte et ne se modifie jamais.
Trois réflexes suffisent pour démarrer : savoir indexer (les indices commencent à
0), savoir parcourir avec une boucle for, et connaître
la différence qui piège tout le monde en début de prépa — une liste est
modifiable (mutable), une chaîne ne l'est pas (immuable). Cette fiche pose ces bases ;
deux fiches sœurs les prolongent ensuite.
t[-1], len), parcourir avec for,
découper avec le slicing, et distinguer liste (mutable) et chaîne (immuable).
Prérequis
- Variables, types et affectation
- Boucle
foret fonctionrange - Fonction
printpour afficher
Les indices te font perdre des points bêtes ? Indexation à partir de 0, dernier élément, bornes du slicing : nos mentors alumni X · Centrale · Mines t'entraînent jusqu'à ce que ces manipulations deviennent des réflexes.
Trouver un mentor →1. La liste : créer et indexer
Une liste s'écrit entre crochets, les éléments séparés par des virgules. Elle peut contenir n'importe quels types de valeurs, et même être vide.
Une liste est une séquence ordonnée et modifiable de valeurs. On y accède élément par élément grâce à son indice, un entier qui commence à 0.
t = [10, 20, 30, 40] # liste de 4 entiers
vide = [] # liste vide
mixte = [1, "deux", 3.0] # types mélangés : autorisé
t[0] # 10 -> premier élément (indice 0)
t[1] # 20
t[3] # 40 -> dernier (indice len(t) - 1 = 3)
len(t) # 4 -> nombre d'élémentst = [10, 20, 30, 40]Création. Les crochets délimitent la liste ; les virgules séparent les éléments. t devient un nom qui désigne cette liste.t[0]Indexation à partir de 0. Le premier élément a l'indice 0, pas 1. C'est le piège n°1 de début de prépa.t[3]Dernier élément. Avec 4 éléments, le dernier indice est 3, soit len(t) - 1. Il n'existe pas d'indice 4.len(t)Longueur. len renvoie le nombre d'éléments. Les indices valides vont de 0 à len(t) - 1.Les indices négatifs
Python permet de compter par la fin avec des indices négatifs. C'est très pratique
pour attraper le dernier élément sans écrire len(t) - 1.
t = [10, 20, 30, 40]
t[-1] # 40 -> dernier
t[-2] # 30 -> avant-dernier
t[-4] # 10 -> équivaut à t[0]| Élément | 10 | 20 | 30 | 40 |
|---|---|---|---|---|
| Indice positif | 0 | 1 | 2 | 3 |
| Indice négatif | -4 | -3 | -2 | -1 |
t[1] et t[-3] désignent
le même élément (ici 20). L'indice négatif n'est qu'un raccourci pour
len(t) + indice.
t = [10, 20, 30, 40], t[4]
déclenche une erreur (IndexError) : le dernier indice valide est 3. Même chose pour
t[-5], qui sort par le bas.
2. Modifier une liste
Une liste est modifiable (on dit mutable) : on peut changer une case, ajouter, insérer ou supprimer des éléments sans recréer la liste.
t = [10, 20, 30]
t[0] = 99 # réaffecte la case d'indice 0 -> [99, 20, 30]
t.append(40) # ajoute 40 à la fin -> [99, 20, 30, 40]
t.insert(1, 15) # insère 15 à l'indice 1 -> [99, 15, 20, 30, 40]
del t[2] # supprime l'élément d'indice 2 -> [99, 15, 30, 40]t[0] = 99Modification en place. On écrase la valeur de la case d'indice 0. La liste garde sa taille ; seule la valeur change.t.append(40)Ajouter à la fin. append allonge la liste d'un élément. C'est LA méthode pour construire une liste au fil d'une boucle.t.insert(1, 15)Insérer. insert(i, v) place v à l'indice i ; tout ce qui suit est décalé d'un cran vers la droite.del t[2]Supprimer. del t[i] retire l'élément d'indice i ; la liste raccourcit et les éléments suivants se décalent vers la gauche.append.
carres = []
for n in range(1, 5):
carres.append(n * n)
# carres vaut [1, 4, 9, 16]t.append(...) agit
directement sur t et ne renvoie rien d'utile. On écrit t.append(40),
jamais t = t.append(40) (qui écraserait t par None).
3. La chaîne de caractères
Une chaîne de caractères (type str) est une séquence de caractères,
écrite entre guillemets. Elle s'indexe et se mesure exactement comme une liste.
Une chaîne est une séquence ordonnée de caractères. On accède au caractère
d'indice i par s[i], et len(s) donne le nombre de caractères.
Contrairement à la liste, elle est immuable : on ne peut pas la modifier en place.
s = "prepa"
s[0] # 'p' -> premier caractère
s[-1] # 'a' -> dernier caractère
len(s) # 5 -> nombre de caractères
# parcours caractère par caractère
for c in s:
print(c) # 'p', 'r', 'e', 'p', 'a's = "prepa"Création. Les guillemets (doubles ou simples) délimitent le texte. Chaque caractère occupe une position, comme une case de liste.s[0]Indexer un caractère. Renvoie une chaîne d'un caractère ('p'). Les indices vont de 0 à len(s) - 1.len(s)Longueur. Le nombre de caractères, espaces compris. "prepa" en compte 5.for c in s:Parcours par caractère. c prend successivement chaque caractère. Pratique pour compter, filtrer ou tester du texte.s = "abc" puis s[0] = "X"
déclenche une erreur (TypeError). On ne modifie jamais une chaîne en place :
on en construit une nouvelle. Par exemple s = "X" + s[1:] donne
"Xbc".
+ colle deux chaînes :
"pré" + "pa" vaut "prépa". Attention, cela crée une nouvelle
chaîne — l'ancienne reste intacte.
4. Parcourir une séquence
Parcourir, c'est passer sur chaque élément l'un après l'autre. Deux façons de faire, valables aussi bien pour une liste que pour une chaîne : par les éléments, ou par les indices.
t = [10, 20, 30]
# (a) par les éléments : le plus simple et le plus lisible
for x in t:
print(x) # 10, puis 20, puis 30
# (b) par les indices : quand on a besoin de la position
for i in range(len(t)):
print(i, t[i]) # 0 10, puis 1 20, puis 2 30for x in t:Parcours par valeur. x prend directement chaque élément de t. À privilégier quand la position n'a pas d'importance.for i in range(len(t)):Parcours par indice. i va de 0 à len(t) - 1 ; on lit l'élément par t[i]. Indispensable pour modifier une case ou comparer des voisins.| Tour | i | t[i] |
|---|---|---|
| 1 | 0 | 10 |
| 2 | 1 | 20 |
| 3 | 2 | 30 |
mot = "abracadabra"
n = 0
for c in mot:
if c == "a":
n = n + 1
# n vaut 55. Le slicing (tranches)
Le slicing extrait une sous-séquence d'un coup, sans boucle. Il marche pareil sur une liste et sur une chaîne, et c'est un outil à connaître par cœur.
t[a:b] renvoie les éléments d'indice a inclus jusqu'à
b exclu. La borne de fin fonctionne comme dans range :
elle n'est pas prise.
t = [10, 20, 30, 40, 50]
t[1:3] # [20, 30] -> indices 1 et 2 (3 exclu)
t[:2] # [10, 20] -> depuis le début
t[3:] # [40, 50] -> jusqu'à la fin
t[:] # [10,20,30,40,50] -> copie de toute la liste
t[::2] # [10, 30, 50] -> un élément sur deux (pas = 2)
s = "informatique"
s[0:4] # 'info'
s[-4:] # 'ique't[1:3]Bornes. On prend d'abord l'indice a, on s'arrête avant b. La tranche contient b - a éléments (ici 2).t[:2]Début omis. Sans a, la tranche part de l'indice 0.t[3:]Fin omise. Sans b, la tranche va jusqu'au dernier élément (inclus).t[:]Copie. Sans borne, on obtient une nouvelle liste identique. Astuce clé pour dupliquer une liste (voir section 6).t[::2]Pas. La 3ᵉ valeur t[a:b:pas] saute des éléments. Un pas de 2 prend un élément sur deux.| Écriture | Sens | Résultat |
|---|---|---|
t[1:4] | de l'indice 1 à 3 | [20, 30, 40] |
t[:3] | les 3 premiers | [10, 20, 30] |
t[2:] | à partir de l'indice 2 | [30, 40, 50] |
t[:] | copie complète | [10, 20, 30, 40, 50] |
t[::2] | un sur deux | [10, 30, 50] |
t[1:3] prend les indices 1 et 2,
pas 3. Pour aller jusqu'au dernier élément d'indice i, il faut écrire
t[a:i+1].
6. Mutable vs immuable, la différence qui piège
C'est LE point à ne pas rater. Une liste se modifie en place ; une chaîne ne se modifie jamais. Sur une chaîne, toute « modification » produit en réalité une nouvelle chaîne.
# Liste : mutable -> on change la case
t = [10, 20, 30]
t[0] = 99
print(t) # [99, 20, 30] (t a changé)
# Chaîne : immuable -> on reconstruit
s = "abc"
# s[0] = "X" # interdit : TypeError
s = "X" + s[1:] # on fabrique une nouvelle chaîne
print(s) # 'Xbc't[0] = 99Liste modifiée sur place. La liste désignée par t est bel et bien changée ; c'est la même liste, avec une case différente.s[0] = "X"Interdit sur une chaîne. Affecter une case d'une chaîne lève une TypeError. Une chaîne est figée.s = "X" + s[1:]Reconstruire. On concatène le nouveau début avec la tranche s[1:]. Le nom s pointe alors vers une chaîne toute neuve.b = a ne duplique rien : a et b désignent la
même liste. Modifier l'une modifie l'autre.
a = [1, 2, 3]
b = a # b est un ALIAS de a (même liste)
b.append(4)
print(a) # [1, 2, 3, 4] -> a a changé aussi !
c = a[:] # vraie copie (tranche complète)
c.append(9)
print(a) # [1, 2, 3, 4] -> a est intactea[:] (ou
list(a)) crée une liste indépendante. Ce réflexe évite des bugs très difficiles à
repérer. Pour une chaîne, la question ne se pose pas : elle est immuable.
Alias, slicing, mutable/immuable : ces subtilités piègent même les bons élèves. En stage Majorant, tu manipules ces notions sur de vrais exercices de Sup, encadré par des alumni X · Centrale · Mines qui te montrent comment ne plus jamais te faire avoir.
Découvrir les stages →7. Exercices d'application
À faire de tête avant d'ouvrir le corrigé.
Soit t = [5, 8, 13, 21, 34]. Donne deux écritures qui renvoient le dernier élément, sans supposer connue la longueur de la liste.
Voir la correction détaillée
t[-1] vaut 34. C'est la façon la plus courte et la plus sûre.t[len(t) - 1] vaut aussi 34 (indice 5 - 1 = 4).t[len(t)] planterait (IndexError), car il n'y a pas d'indice 5.Soit t = [10, 20, 30, 40, 50, 60]. Que valent les tranches suivantes ?
t = [10, 20, 30, 40, 50, 60]
t[1:4]
t[:2]
t[3:]
t[::2]Voir la correction détaillée
t[1:4] : indices 1 à 3 (4 exclu) = [20, 30, 40].t[:2] : du début à l'indice 1 = [10, 20].t[3:] : de l'indice 3 à la fin = [40, 50, 60].t[::2] : un élément sur deux (pas de 2) = [10, 30, 50].Qu'affiche ce programme, ligne par ligne ?
t = [3, 1, 4, 1]
for i in range(len(t)):
if t[i] > 2:
print(i, t[i])Voir la correction détaillée
i parcourt 0, 1, 2, 3. On n'affiche que si t[i] > 2.t[0] = 3 > 2 -> affiche 0 3.t[1] = 1, non affiché. i=2 : t[2] = 4 > 2 -> affiche 2 4.t[3] = 1, non affiché. Sortie finale : 0 3 puis 2 4.8. Erreurs classiques (les pièges qui coûtent des points)
Quatre pièges reviennent sans arrêt dans les copies. Repère-les avant qu'ils ne te coûtent cher.
t[len(t)] plante toujours. Le bon dernier indice est
len(t) - 1, ou plus simplement t[-1].
s[0] = "X" est impossible : une chaîne
est immuable. Il faut reconstruire, par exemple s = "X" + s[1:].
len(t) est le
nombre d'éléments ; le dernier indice vaut len(t) - 1. Boucler avec
range(len(t)) est correct (0 à len(t) - 1) ; écrire t[len(t)]
ne l'est jamais.
b = a ne copie pas la liste : les deux noms
désignent la même liste, donc b.append(...) modifie aussi a. Pour une vraie
copie, utilise a[:] ou list(a).
+ modifie la chaîne. s + "!" ne change pas
s : ça crée une nouvelle chaîne. Pour la garder, réaffecte : s = s + "!".
8. Pour aller plus loin
Tu maîtrises les bases : indexer, parcourir, découper, et distinguer mutable et immuable. Les deux fiches sœurs approfondissent chacun des deux objets, et les chapitres d'algorithmique réinvestissent tout ce que tu viens de voir.
- Manipuler les listes (slug
manipuler-les-listes) — méthodes utiles (append,sort,in), listes en compréhension, listes de listes. - Chaînes de caractères (slug
chaines-de-caracteres) — méthodes (split,upper,find), formatage et parcours de texte. - Patrons d'algorithmes — accumulateur (somme, compte), recherche d'un maximum, recherche d'un élément, qui s'appuient tous sur le parcours d'une séquence.
Récap final — Ce qu'il faut absolument retenir
Tu dois pouvoir répondre « oui » sans hésiter à chaque point.
- Sais-tu créer une liste avec des crochets et une chaîne avec des guillemets ?
- Sais-tu que l'indexation commence à 0 et que le dernier indice vaut
len(t) - 1? - Sais-tu utiliser les indices négatifs (
t[-1]= dernier) ? - Sais-tu ce que renvoie
lensur une liste et sur une chaîne ? - Sais-tu modifier une liste :
t[i] = ...,append,insert,del? - Sais-tu qu'une chaîne est immuable et qu'on ne peut pas faire
s[0] = "X"? - Sais-tu parcourir par valeur (
for x in t) et par indice (for i in range(len(t))) ? - Sais-tu extraire une tranche
t[a:b]en te rappelant quebest exclu ? - Sais-tu à quoi servent
t[:],t[a:],t[:b]et le past[::2]? - Sais-tu qu'une liste est mutable et une chaîne immuable, et ce que ça change ?
- Sais-tu que
b = acrée un alias, et qu'une vraie copie s'écrita[:]? - Sais-tu vers quelles fiches sœurs aller pour approfondir listes et chaînes ?