Stage Toussaint · dès le 19 octobre
Majorant
📘 Fiche de cours · 1re année📐 MPSI💻 Informatique Informatique communeNiveau · Terminale → Sup

Listes et chaînes de caractères

Créer, indexer, parcourir et découper des listes et des chaînes ; comprendre qu'une liste est modifiable et une chaîne non — avec les pièges d'indices et deux exercices corrigés.

Fiche rédigée par les mentors Majorant — alumni Polytechnique, CentraleSupélec et Mines Paris.

1 définitionsMis à jour le 2026-08-02

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.

Objectif passerelle Terminale → Sup — Créer et indexer une séquence (indices à partir de 0, indice négatif 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 for et fonction range
  • Fonction print pour afficher
🎯 Accompagnement Majorant

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.

Définition 1.1 — Liste

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éments
🔍 Décryptage ligne par ligne
t = [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]
Les deux façons d'indexer t = [10, 20, 30, 40]
Élément10203040
Indice positif0123
Indice négatif-4-3-2-1
📝 Deux adresses, une même case. 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.
⚠ Indice hors bornes. Sur 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]
🔍 Décryptage ligne par ligne
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.
💡 Construire une liste pas à pas. Le motif le plus courant : partir d'une liste vide et empiler avec append.
carres = []
for n in range(1, 5):
    carres.append(n * n)
# carres vaut [1, 4, 9, 16]
📝 Une méthode, une notation à point. 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.

Définition 3.1 — Chaîne de caractères

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'
🔍 Décryptage ligne par ligne
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.
⚠ La chaîne est immuable. 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".
📝 Concaténer. L'opérateur + 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 30
🔍 Décryptage ligne par ligne
for 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.
Trace du parcours par indice de t = [10, 20, 30]
Tourit[i]
1010
2120
3230
💡 Compter une lettre dans un mot. Un parcours par valeur suffit pour accumuler un compteur.
mot = "abracadabra"
n = 0
for c in mot:
    if c == "a":
        n = n + 1
# n vaut 5

5. 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.

Définition 5.1 — Tranche

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'
🔍 Décryptage ligne par ligne
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.
Tranches usuelles sur t = [10, 20, 30, 40, 50]
ÉcritureSensRé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]
⚠ La borne de fin est exclue. 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'
🔍 Décryptage ligne par ligne
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.
⚠ Alias : deux noms, une seule liste. Comme une liste est mutable, la copier par 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 intacte
📝 Pour dupliquer une liste, prends une tranche. a[:] (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.
🎯 Passe le cap des séquences

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é.

Exo 1Le dernier élémentFacile

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
L'indice négatif : t[-1] vaut 34. C'est la façon la plus courte et la plus sûre.
Via la longueur : t[len(t) - 1] vaut aussi 34 (indice 5 - 1 = 4).
Piège à éviter : t[len(t)] planterait (IndexError), car il n'y a pas d'indice 5.
Exo 2Extraire une trancheIntermédiaire

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].
Exo 3Prévoir un parcours par indiceIntermédiaire

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.
i=0 : t[0] = 3 > 2 -> affiche 0 3.
i=1 : t[1] = 1, non affiché. i=2 : t[2] = 4 > 2 -> affiche 2 4.
i=3 : 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.

⚠ Indice hors bornes (IndexError). Sur une liste de 4 éléments, le dernier indice est 3, pas 4. t[len(t)] plante toujours. Le bon dernier indice est len(t) - 1, ou plus simplement t[-1].
⚠ Modifier une chaîne en place. s[0] = "X" est impossible : une chaîne est immuable. Il faut reconstruire, par exemple s = "X" + s[1:].
⚠ Confondre longueur et dernier indice. 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.
⚠ Alias au lieu de copie. 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).
⚠ Croire que + 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 len sur 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 que b est exclu ?
  • Sais-tu à quoi servent t[:], t[a:], t[:b] et le pas t[::2] ?
  • Sais-tu qu'une liste est mutable et une chaîne immuable, et ce que ça change ?
  • Sais-tu que b = a crée un alias, et qu'une vraie copie s'écrit a[:] ?
  • Sais-tu vers quelles fiches sœurs aller pour approfondir listes et chaînes ?

Débloque la fiche complète

Théorèmes, démonstrations à savoir refaire, méthodes-types et pièges de concours : crée ton compte gratuit pour tout lire. Une seule fois pour toutes les fiches et ressources Majorant.

Gratuit · vos données restent confidentielles.

Valide tes acquis

Quiz — Listes et chaînes

8 questions · une à la fois · seuil de maîtrise 80 %.

Informatique commune · Terminale → SupQuiz — Listes et chaînesQuestion 1 / 8
FacileChoix unique1 pt

Quel est l'indice du premier élément d'une liste en Python ?

Sélectionne une réponse pour valider.

Fiches associées

Tu veux aller plus loin sur ce chapitre ?

Nos mentors ont passé les mêmes concours, en MPSI, deux à trois ans plus tôt. Ils reprennent ce chapitre avec toi — démonstrations détaillées, exercices type concours, oraux blancs.

Cours particuliers d'informatique en MPSI

Voir aussi : Cours particuliers d'informatique en prépa scientifique