
Le slicing en Python est une technique incontournable pour extraire, modifier
ou analyser des séquences comme les listes, tuples et chaînes de caractères.
Il repose sur une syntaxe simple basée sur des indices, sequence[start:stop:step],
qui permet de manipuler efficacement des données sans boucles complexes.
Que ce soit pour extraire une sous-liste, inverser une chaîne de caractères ou récupérer des éléments spécifiques, le slicing est un outil puissant et intuitif. Ce guide le montre pas à pas avec des exemples clairs et des astuces pratiques, pour les développeurs débutants et intermédiaires.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lire la syntaxe
start:stop:stepet ses valeurs par défaut - Extraire une portion d'une liste, d'une chaîne ou d'un tuple
- Compter depuis la fin avec les indices négatifs
- Inverser une séquence avec
[::-1]et sauter des éléments avec un pas - Modifier une liste par slicing et comprendre pourquoi une chaîne reste immuable
- Copier une séquence avec
[:]et connaître la limite de la copie superficielle
Syntaxe du slicing en Python
Section intitulée « Syntaxe du slicing en Python »Le slicing en Python repose sur une notation simple et efficace qui permet d’extraire une portion d’une liste, d’un tuple ou d’une chaîne de caractères sans avoir besoin de boucles complexes.
L’opérateur de slicing s’écrit sous la forme :
sequence[start:stop:step]start: indice de départ (inclus)stop: indice de fin (exclu)step: pas de saut entre les éléments
Si un des paramètres est omis, Python utilise ses valeurs par défaut :
sequence[:stop] # Commence à 0 et s'arrête à stop (exclu)sequence[start:] # Commence à start et va jusqu'à la finsequence[::step] # Prend tout avec un pas spécifiquesequence[:] # Copie complète de la séquenceExemples simples :
- Slicing sur une liste
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[2:5]) # [2, 3, 4]print(numbers[:4]) # [0, 1, 2, 3]print(numbers[5:]) # [5, 6, 7, 8, 9]print(numbers[::2]) # [0, 2, 4, 6, 8] (un élément sur deux)- Slicing sur une chaîne de caractères
text = "Python slicing"
print(text[0:6]) # 'Python'print(text[:6]) # 'Python'print(text[7:]) # 'slicing'print(text[::2]) # 'Pto lcig'Comprendre les indices négatifs
Section intitulée « Comprendre les indices négatifs »Python permet d’utiliser des indices négatifs pour compter à partir de la fin de la séquence :
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[-3:]) # [7, 8, 9]print(numbers[:-3]) # [0, 1, 2, 3, 4, 5, 6]print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] (inversion)Exemple avec une chaîne de caractères :
text = "Python slicing"
print(text[-7:]) # 'slicing'print(text[:-7]) # 'Python 'print(text[::-1]) # 'gnicils nohtyP' (inversion)Le slicing est donc un moyen très puissant pour extraire, transformer et manipuler les séquences en Python. Voyons maintenant comment l’appliquer spécifiquement aux listes.
Slicing sur les listes
Section intitulée « Slicing sur les listes »Le slicing est particulièrement utile avec les listes, car il permet d'extraire des sous-listes, d'accéder aux éléments de manière flexible et même de modifier leur contenu.
Extraire une sous-liste
Section intitulée « Extraire une sous-liste »La technique la plus courante consiste à récupérer une portion de la liste
en utilisant la notation start:stop.
fruits = ["pomme", "banane", "cerise", "datte", "figue", "kiwi"]
print(fruits[1:4]) # ['banane', 'cerise', 'datte']print(fruits[:3]) # ['pomme', 'banane', 'cerise']print(fruits[3:]) # ['datte', 'figue', 'kiwi']Dans chaque cas :
- L'élément start est inclus.
- L'élément stop est exclu.
Utiliser des indices négatifs
Section intitulée « Utiliser des indices négatifs »Python permet d'utiliser des indices négatifs pour compter depuis la fin de la liste.
print(fruits[-3:]) # ['datte', 'figue', 'kiwi']print(fruits[:-3]) # ['pomme', 'banane', 'cerise']Astuce : L'indice
-1représente le dernier élément,-2l'avant-dernier, etc.
Slicing avec un pas (step)
Section intitulée « Slicing avec un pas (step) »L'argument step permet de sauter des éléments dans la liste.
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[::2]) # [0, 2, 4, 6, 8] (un élément sur deux)print(numbers[1::2]) # [1, 3, 5, 7, 9] (éléments impairs)On peut aussi utiliser un pas négatif pour parcourir la liste à l’envers.
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]print(numbers[::-2]) # [9, 7, 5, 3, 1] (un élément sur deux en inversé)Modifier une liste avec le slicing
Section intitulée « Modifier une liste avec le slicing »Contrairement aux chaînes de caractères qui sont immuables, on peut modifier une liste en utilisant le slicing.
letters = ["a", "b", "c", "d", "e"]
letters[1:3] = ["x", "y"] # Remplace ['b', 'c'] par ['x', 'y']print(letters) # ['a', 'x', 'y', 'd', 'e']On peut aussi supprimer plusieurs éléments en leur attribuant une liste vide.
letters[2:4] = []print(letters) # ['a', 'x', 'e']Cas particulier : inverser une liste
Section intitulée « Cas particulier : inverser une liste »Une astuce très utilisée consiste à inverser une liste avec [::-1].
words = ["Python", "est", "puissant"]print(words[::-1]) # ['puissant', 'est', 'Python']Erreurs courantes à éviter
Section intitulée « Erreurs courantes à éviter »-
Attention aux indices hors limites
numbers = [1, 2, 3, 4]print(numbers[10:]) # Retourne [] au lieu d'une erreur -
Ne pas confondre slicing et accès direct
print(numbers[2]) # 3 (un seul élément)print(numbers[2:3]) # [3] (une liste contenant un seul élément)
Le slicing sur les listes offre donc une grande flexibilité. Voyons maintenant comment appliquer ces mêmes principes aux chaînes de caractères.
Slicing sur les chaînes de caractères
Section intitulée « Slicing sur les chaînes de caractères »Les chaînes de caractères en Python sont immuables, mais on peut les manipuler facilement grâce au slicing. Cette technique permet d’extraire des morceaux de texte, de les inverser ou de récupérer certains caractères selon un motif précis.
Extraire une sous-chaîne
Section intitulée « Extraire une sous-chaîne »Comme pour les listes, on utilise la notation start:stop:step pour extraire
une portion de texte.
texte = "Python slicing"
print(texte[0:6]) # 'Python'print(texte[:6]) # 'Python' (équivalent à [0:6])print(texte[7:]) # 'slicing' (du 7e caractère à la fin)À noter : Le caractère à l’indice
stopest exclu de la sous-chaîne.
Utiliser des indices négatifs
Section intitulée « Utiliser des indices négatifs »Les indices négatifs permettent de découper la chaîne en partant de la fin.
print(texte[-7:]) # 'slicing' (les 7 derniers caractères)print(texte[:-7]) # 'Python ' (tout sauf les 7 derniers)Slicing avec un pas (step)
Section intitulée « Slicing avec un pas (step) »On peut utiliser step pour extraire un caractère sur deux, par exemple.
print(texte[::2]) # 'Pto lcig' (un caractère sur deux)print(texte[1::2]) # 'yhnsiin' (les lettres aux indices impairs)Inverser une chaîne de caractères
Section intitulée « Inverser une chaîne de caractères »Une astuce très utile est d’inverser une chaîne avec [::-1].
print(texte[::-1]) # 'gnicils nohtyP'C’est une technique souvent utilisée pour vérifier si un mot est un palindrome :
def est_palindrome(mot): return mot == mot[::-1]
print(est_palindrome("radar")) # Trueprint(est_palindrome("python")) # FalseDifférence entre split() et slicing
Section intitulée « Différence entre split() et slicing »Le slicing permet d’extraire une partie fixe d’une chaîne, tandis que
split() découpe le texte selon un séparateur.
phrase = "Python est un langage puissant"mots = phrase.split() # Sépare par défaut sur les espacesprint(mots) # ['Python', 'est', 'un', 'langage', 'puissant']Si on veut extraire les trois premiers mots avec slicing :
print(" ".join(mots[:3])) # 'Python est un'Cas d’usage pratique : récupérer un mot spécifique
Section intitulée « Cas d’usage pratique : récupérer un mot spécifique »On peut extraire un mot précis d’une phrase sans split().
phrase = "Le slicing en Python est puissant"print(phrase[3:10]) # 'slicing'Si on ne connaît pas les indices exacts, split() peut être plus flexible.
print(phrase.split()[1]) # 'slicing'Erreurs courantes à éviter
Section intitulée « Erreurs courantes à éviter »-
Confondre slicing et accès direct
texte = "Python"print(texte[2]) # 't' (un seul caractère)print(texte[2:3]) # 't' (sous-chaîne de longueur 1) -
Essayer de modifier une chaîne
texte = "Python"texte[0] = "J" # Erreur : TypeError (les chaînes sont immuables)
Si on veut modifier une chaîne, on doit la reconstruire.
texte_modifie = "J" + texte[1:]print(texte_modifie) # 'Jython'Le slicing sur les chaînes de caractères est donc un outil puissant pour manipuler du texte. Passons maintenant au slicing sur les tuples.
Slicing sur les tuples
Section intitulée « Slicing sur les tuples »Les tuples sont des séquences immuables, similaires aux listes, mais non modifiables après leur création. Le slicing fonctionne exactement comme pour les listes, sauf qu’on ne peut pas modifier le contenu du tuple.
Extraire une sous-partie d’un tuple
Section intitulée « Extraire une sous-partie d’un tuple »On utilise la notation start:stop:step pour obtenir une portion d’un
tuple.
jours = ("lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche")
print(jours[1:4]) # ('mardi', 'mercredi', 'jeudi')print(jours[:3]) # ('lundi', 'mardi', 'mercredi')print(jours[4:]) # ('vendredi', 'samedi', 'dimanche')Utiliser des indices négatifs
Section intitulée « Utiliser des indices négatifs »Comme pour les listes et les chaînes, on peut compter à rebours depuis la fin du tuple.
print(jours[-3:]) # ('vendredi', 'samedi', 'dimanche')print(jours[:-3]) # ('lundi', 'mardi', 'mercredi', 'jeudi')Slicing avec un pas (step)
Section intitulée « Slicing avec un pas (step) »On peut utiliser l’option step pour récupérer un élément sur deux.
print(jours[::2]) # ('lundi', 'mercredi', 'vendredi', 'dimanche')print(jours[::-1]) # ('dimanche', 'samedi', 'vendredi', 'jeudi', 'mercredi', 'mardi', 'lundi') (inversion)Différence avec les listes : immuabilité des tuples
Section intitulée « Différence avec les listes : immuabilité des tuples »Contrairement aux listes, on ne peut pas modifier un tuple après sa création.
jours[0] = "dimanche" # TypeError : un tuple ne peut pas être modifiéSi on veut modifier un tuple, il faut le transformer en liste, effectuer les modifications, puis recréer un tuple.
jours_liste = list(jours) # Conversion en listejours_liste[0] = "dimanche"jours_modifie = tuple(jours_liste) # Conversion en tupleprint(jours_modifie)# ('dimanche', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche')Utilisation du slicing sur les tuples en pratique
Section intitulée « Utilisation du slicing sur les tuples en pratique »- Extraire des données d’un tuple
Si on stocke des coordonnées GPS dans un tuple (latitude, longitude), on
peut facilement extraire chaque valeur.
coordonnees = (48.8566, 2.3522) # Paris
latitude = coordonnees[:1] # (48.8566,)longitude = coordonnees[1:] # (2.3522,)- Obtenir les éléments d’un tuple par plage d’index
Si on a des données triées, on peut obtenir facilement une plage spécifique.
scores = (10, 12, 14, 16, 18, 20)print(scores[2:5]) # (14, 16, 18)- Vérifier si un élément est présent avec slicing
def contient_element(tuple_data, element): return element in tuple_data[:]
print(contient_element(jours, "mardi")) # Trueprint(contient_element(jours, "férié")) # FalseLes tuples sont donc bien compatibles avec le slicing, mais il faut garder en tête qu’ils sont immuables. Passons maintenant aux cas avancés et astuces de performance.
Slicing et copies en mémoire
Section intitulée « Slicing et copies en mémoire »Le slicing sert aussi à copier une séquence, mais cette copie a une limite qu'il faut connaître pour éviter des bugs difficiles à traquer. Voici la différence entre une copie superficielle obtenue avec [:] et une copie profonde.
Copie superficielle (shallow copy)
Section intitulée « Copie superficielle (shallow copy) »Le slicing d’une liste crée une nouvelle liste avec des références aux mêmes objets.
original = [1, 2, [3, 4]]copie = original[:]
copie[0] = 99copie[2][0] = 999
print(original) # [1, 2, [999, 4]]print(copie) # [99, 2, [999, 4]]Explication : Les éléments simples (entiers, chaînes) sont copiés indépendamment, mais les objets mutables (listes, dictionnaires, objets) conservent leurs références.
Copie profonde (deep copy)
Section intitulée « Copie profonde (deep copy) »Si on veut copier complètement une structure imbriquée sans effet de bord,
il faut utiliser copy.deepcopy().
import copy
original = [1, 2, [3, 4]]copie_profonde = copy.deepcopy(original)
copie_profonde[2][0] = 999
print(original) # [1, 2, [3, 4]]print(copie_profonde) # [1, 2, [999, 4]]À retenir
Section intitulée « À retenir »- Syntaxe
sequence[start:stop:step]:startinclus,stopexclu,stepoptionnel. - Valeurs par défaut :
[:n]part de 0,[n:]va jusqu'à la fin,[:]copie toute la séquence. - Indices négatifs :
-1est le dernier élément ;[-3:]prend les trois derniers. - Inverser une séquence se fait avec
[::-1], sans fonction supplémentaire. - Modifier par slicing ne marche que sur les listes ; les chaînes et tuples sont immuables.
[:]crée une copie superficielle : les objets imbriqués restent partagés, utilisezcopy.deepcopy()pour une copie profonde.- Un index hors limites ne lève pas d'erreur en slicing (
numbers[10:]renvoie[]), contrairement à l'accès direct.
FAQ : questions fréquentes
Section intitulée « FAQ : questions fréquentes »Les réponses courtes ci-dessous couvrent les questions les plus recherchées sur le slicing Python. Chaque exemple est autonome et testé sur Python 3.12.
sequence[start:stop:step] :start: index de départ (inclus)stop: index de fin (exclu)step: pas entre les éléments (optionnel)
nombres = [0, 1, 2, 3, 4, 5]
print(nombres[1:4]) # [1, 2, 3]
print(nombres[::2]) # [0, 2, 4]
Le slicing renvoie toujours une nouvelle séquence du même type.[::-1] : Python parcourt la séquence de la fin vers le début.mots = ["Python", "est", "puissant"]
print(mots[::-1]) # ['puissant', 'est', 'Python']
print("radar"[::-1]) # 'radar'
C'est la méthode la plus concise pour inverser une liste, un tuple ou une chaîne, sans boucle ni fonction. Elle sert souvent à tester un palindrome : mot == mot[::-1].sequence[:] découpe la séquence du début à la fin, ce qui en renvoie une copie complète :original = [1, 2, 3]
copie = original[:]
copie[0] = 99
print(original) # [1, 2, 3] (inchangée)
C'est une copie superficielle : les objets imbriqués (listes, dictionnaires) restent partagés entre l'original et la copie. Pour une copie totalement indépendante, utilisez copy.deepcopy().-1 désigne le dernier élément, -2 l'avant-dernier, etc.nombres = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nombres[-3:]) # [7, 8, 9] (les 3 derniers)
print(nombres[:-3]) # [0, 1, 2, 3, 4, 5, 6]
Ils se combinent avec start, stop et step, y compris pour inverser une séquence avec [::-1].nombres = [10, 20, 30, 40]
print(nombres[2]) # 30 (un entier)
print(nombres[2:3]) # [30] (une liste)
Autre différence clé : un index hors limites lève une IndexError en accès direct, alors qu'un slicing hors limites renvoie une séquence vide sans erreur (nombres[10:] donne []).lettres = ["a", "b", "c", "d", "e"]
lettres[1:3] = ["x", "y"] # remplace ['b', 'c']
print(lettres) # ['a', 'x', 'y', 'd', 'e']
lettres[1:3] = [] # supprime la portion
Les chaînes de caractères et les tuples sont immuables : toute modification par slicing lève une TypeError. Il faut alors reconstruire une nouvelle séquence.