Aller au contenu
Développement medium

Maitriser le slicing en Python

16 min de lecture

logo python

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. Grâce à une syntaxe simple basée sur des indices (start:stop:step), il 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. Je vais vous montrer comment l’utiliser efficacement avec des exemples clairs et des astuces pratiques.

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 fin
sequence[::step] # Prend tout avec un pas spécifique
sequence[:] # Copie complète de la séquence

Exemples simples :

  1. 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)
  1. 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'

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.

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.

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.

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 -1 représente le dernier élément, -2 l’avant-dernier, etc.

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

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']

Une astuce très utilisée consiste à inverser une liste avec [::-1].

words = ["Python", "est", "puissant"]
print(words[::-1]) # ['puissant', 'est', 'Python']
  1. Attention aux indices hors limites

    numbers = [1, 2, 3, 4]
    print(numbers[10:]) # Retourne [] au lieu d'une erreur
  2. 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.

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.

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 stop est exclu de la sous-chaîne.

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)

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)

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")) # True
print(est_palindrome("python")) # False

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 espaces
print(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'
  1. 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)
  2. 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.

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.

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')

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')

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 liste
jours_liste[0] = "dimanche"
jours_modifie = tuple(jours_liste) # Conversion en tuple
print(jours_modifie)
# ('dimanche', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche')
  1. 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,)
  1. 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)
  1. 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")) # True
print(contient_element(jours, "férié")) # False

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

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] = 99
copie[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.

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]]

Le slicing en Python est une technique essentielle pour manipuler efficacement les listes, chaînes de caractères et tuples. Grâce à une syntaxe simple (start:stop:step), il permet d’extraire, modifier ou analyser des données sans boucles complexes.

Que ce soit pour extraire des éléments spécifiques, inverser une séquence ou créer des sous-ensembles, le slicing offre une solution rapide et optimisée. Avec un bon usage des indices négatifs, des pas et des copies, on peut éviter les erreurs courantes et améliorer la performance de son code.

En combinant slicing, compréhension de liste et gestion de mémoire, vous maîtriserez pleinement cette technique et pourrez l’appliquer à des cas concrets en data science, traitement de texte et algorithmes avancés.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.