Le slicing est une fonctionnalité de Python qui permet d'extraire des sous-ensembles (tranches) à partir de séquences comme des listes, des tuples, ou des chaînes de caractères. Le slicing est un outil très utilisé, car sa syntaxe est à la fois concise et lisible :
sequence[start:stop:step]
-
startest l'indice de début de la tranche et est inclu. S'il n'est pas renseigné, la tranche commence au début (indice 0). -
stopest l'indice de fin de la tranche et est exclu. S'il n'est pas renseigné, la tranche inclut tous les éléments jusqu'à la fin. -
stepcorrespond à l'intervalle entre les éléments. S'il n'est pas renseigné, le pas par défaut est 1.
Utilisation basique
Voici quelques exemples pour illustrer les cas les plus courants :
nombres = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Extraire les éléments de l'indice 2 à 4 (5 exclu) print(nombres[2:5]) # Résultat : [2, 3, 4] # Extraire les 4 premiers éléments print(nombres[:4]) # Résultat : [0, 1, 2, 3] # Extraire les éléments à partir de l'indice 6 print(nombres[6:]) # Résultat : [6, 7, 8, 9] # Créer une copie complète de la liste copie_nombres = nombres[:] print(copie_nombres) # Résultat : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Manipuler les indices négatifs
Les indices négatifs permettent d'accéder aux éléments en partant de la fin de la séquence. L'indice -1 correspond au dernier élément, -2 à l'avant-dernier, et ainsi de suite.
Schéma pour le slicing
nombres = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Extraire les 3 derniers éléments print(nombres[-3:]) # Résultat : [7, 8, 9] # Extraire la liste sans les 2 derniers éléments print(nombres[:-2]) # Résultat : [0, 1, 2, 3, 4, 5, 6, 7] # Extraire une tranche du 3ème au 2ème élément en partant de la fin print(nombres[-3:-1]) # Résultat : [7, 8] # Combiner un indice de départ positif et un indice de fin négatif ma_liste = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] print(ma_liste[2:-3]) # Résultat : ['c', 'd', 'e']
Le schéma ci-dessus illustre clairement le fonctionnement des indices positifs et négatifs. Il aide à mieux appréhender la suite de cet article.
Le paramètre step
Le paramètre step permet de sauter des éléments :
nombres = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Extraire un élément sur deux print(nombres[::2]) # Résultat : [0, 2, 4, 6, 8] # Extraire un élément sur trois, en partant de l'indice 1 print(nombres[1::3]) # Résultat : [1, 4, 7] # Inverser une séquence print(nombres[::-1]) # Résultat : [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] # Inverser et extraire un élément sur deux print(nombres[::-2]) # Résultat : [9, 7, 5, 3, 1]
Chaînes de caractères et tuples
Le slicing n'est pas seulement utilisé pour les listes. Il fonctionne de la même manière sur les chaînes de caractères et les tuples :
# Avec une chaîne de caractères ma_chaine = "Bonjour le monde" print(ma_chaine[0:7]) # Résultat : "Bonjour" # Avec un tuple mon_tuple = (10, 20, 30, 40, 50) print(mon_tuple[1:3]) # Résultat : (20, 30)
Modifier une liste avec le slicing
Il n'est pas possible de modifier les chaînes de caractères et les tuples, car ils sont immuables. Les listes étant muables, il est possible de les modifier :
nombres = [0, 1, 2, 3, 4, 5] # Remplacer une tranche d'éléments nombres[1:4] = [10, 20, 30] print(nombres) # Résultat : [0, 10, 20, 30, 4, 5] # Insérer des éléments sans en supprimer nombres[1:1] = [50, 60] print(nombres) # Résultat : [0, 50, 60, 10, 20, 30, 4, 5] # Supprimer une tranche del nombres[2:5] print(nombres) # Résultat : [0, 50, 30, 4, 5]
Pour bien comprendre la différence entre le remplacement et l'insertion :
-
Si la tranche contient des éléments (
start < end), l'assignation remplace les éléments par le nouveau contenu -
Si la tranche est vide (
start == end), il n'y a rien à remplacer, Python insère les nouveaux éléments à l'indexstart