Inverser une chaine de caractères en Python
Avez-vous remarqué qu’en Python, il n’y a pas de méthode .reverse()
pour les chaînes de caractères comme il y en a pour les listes ? Et c’est normal… La méthode list.reverse()
inverse la liste, elle modifie la donnée. Les chaînes de caractères étant immuables, ce n’est donc pas possible.
Alors dans cet article on va voir la manière pour inverser une chaine de caractères. Non, il n’y a pas 5 méthodes pour inverser une chaîne de caractères, Zen de Python nous rappelle qu’il ne devrait y avoir qu’une, et de préférence une seule, manière évidente de faire les choses.
Comment inverser une chaine de caractères en Python ?
L’outil, vous le connaissez certainement déjà : c’est le slicing !
Si vous ne connaissez pas le slicing, j’y ai consacré un article. Vous devez connaître le Slicing pour coder efficacement en Python.
Le code est aussi simple que :
>>> 'abc'[::-1] 'cba'
Et voilà… C’est tout.
Cette expression retournant une chaine de caractères inversée il s’agit bien d’une nouvelle donnée. La chaine initiale n’est évidemment pas modifiée (impossible puisqu’immuable).
Et la fonction reversed() ?
La fonction reversed(seq) est une fonction built-in qui prend en paramètre une séquence et retourne un objet qui est un itérateur.
>>> reversed('abc') <reversed at 0x1050cfa30>
Nous pouvons donc itérer sur cet objet :
>>> for c in reversed('abc'): ... print(c) ... c b a
Ça ne nous produit pas une chaine inversée, nous pourrions la reconstruire en concaténant le retour :
>>> "".join(""reversed('abc')) 'cba'
À priori, ça fait le job. Et on voit souvent ce code dans les tutos sur le web. Mais ne l’utilisez pas pour inverser une chaine de caractères. Cette fonction existe pour parcourir une séquence en sens inverse.
L’utiliser pour inverser une chaine de caractères a deux problèmes.
Une question de typage canard
Python utilise abondamment le principe du Duck Typing, ce fameux typage canard. En Python, on ne va pas s’intéresser au type de la donnée mais à ce qu’elle peut faire. Le code avec le slicing fonctionne avec toute séquence (toute collection ordonnée) et plus généralement avec tout type compatible avec le slicing. Celui avec la méthode str.join() ne fonctionne qu’avec les chaines de caractères.
Une question de performance
Si je fais un timeit sur ces deux expressions, avec le slicing, j’obtiens 40,9 ns. Avec la fonction reversed()
et la méthode str.join()
, 136 ns… On est à plus de fois 3.
Mais attendez, ceci est valable pour une chaine de 3 caractères. Sur tout l’alphabet (donc… 26 caractères), on passe à 49 ns pour le slicing (respectable) et 334 pour la fonction reversed…
En conclusion
Pour inverser une chaine de caractères… Utilisez le slicing. C’est fait pour, c’est performant et ça s’applique à toute séquence.
Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉
À propos de... Darko Stankovski
iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.
Merci pour le rappel et la notion de performance
cool