ProgrammationDéveloppeur Python

Qu'est-ce que le slicing de liste en Python, comment ça fonctionne, pourquoi l'utiliser à la place des boucles, et quels sont les écueils lors de son utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Contexte : Les slices (slicing) existent en Python depuis le début, comme une manière syntaxiquement pratique d'obtenir des fragments de séquences sans avoir à les parcourir manuellement avec une boucle.

Problème : Les programmeurs venant d'autres langages utilisent souvent des boucles explicites pour travailler avec des sous-listes. Cela augmente le volume de code et réduit la performance.

Solution : Le slicing de liste permet d'obtenir des parties d'une liste, d'une chaîne ou d'autres séquences de manière compacte, claire et efficace. Les slices ne modifient pas l'objet d'origine, mais retournent une copie ou une vue (pour certains types).

Exemple de code :

lst = [0, 1, 2, 3, 4, 5] sub = lst[1:4] # [1, 2, 3] reverse = lst[::-1] # [5, 4, 3, 2, 1, 0] every_second = lst[::2] # [0, 2, 4]

Caractéristiques clés :

  • Syntaxe lisible pour obtenir des sous-listes sans boucles
  • Fonctionne également avec des chaînes et des tuples
  • Les slices ne modifient pas la liste d'origine (si le type est list, c'est un nouvel objet)

Questions pièges.

Le changement de valeur dans une slice affecte-t-il la liste d'origine ?

Non : lorsque vous attribuez une nouvelle liste à une slice, vous modifiez la liste d'origine à ces positions ; mais en prenant une slice, vous obtenez une nouvelle list.

Exemple :

lst = [1, 2, 3, 4] lst2 = lst[1:3] # [2, 3] lst2[0] = 20 # N'affecte pas lst : lst2 est un nouvel objet

Cependant :

lst[1:3] = [7, 8] # cela modifie directement lst

Comment fonctionne une slice avec des indices négatifs ?

Les indices négatifs sont comptés à partir de la fin : -1 est le dernier élément, -2 est l'avant-dernier. Par exemple, lst[:-1] signifie tous les éléments sauf le dernier.


Que se passe-t-il si on dépasse les limites de la liste dans une slice ?

Python gère ces cas "intelligemment" : il n'y aura pas d'erreur, la slice sera simplement limitée par les frontières disponibles. Par exemple, lst[100:200] donnera une liste vide ou le sous-liste maximum possible.


Erreurs typiques et anti-patterns

  • Utilisation de boucles pour obtenir ou copier des sous-listes
  • Oublient que lst[:] retourne toujours une copie de la liste, pas un nouveau lien
  • S'attendent à ce que le slicing modifie l'objet d'origine, ce qui n'est pas le cas

Exemple de la vie

Cas négatif

Le traitement d'une liste prend des centaines de lignes avec des boucles imbriquées et des conditions pour "découper" les données d'entrée, le code est complexe et lent.

Avantages :

  • Contrôle sur le processus à chaque étape

Inconvénients :

  • Inefficace
  • Illisible
  • Erreurs lors de la modification des limites

Cas positif

Le même code est réécrit en utilisant le slicing et des fonctions intégrées, occupant moins de lignes, facile à tester.

Avantages :

  • Haute vitesse
  • Compacité
  • Clarté de l'intention

Inconvénients :

  • Nécessite la connaissance de la syntaxe du slicing
  • Pas toujours adapté à un filtrage complexe (lorsqu'un prédicat complexe est nécessaire)