Il n'y a pas de reverse
fonction intégrée pour l' str
objet Python . Quelle est la meilleure façon de mettre en œuvre cette méthode?
Si vous fournissez une réponse très concise, veuillez préciser son efficacité. Par exemple, si l' str
objet est converti en un autre objet, etc.
Réponses:
Que diriez-vous:
Il s'agit d' une syntaxe de tranche étendue . Cela fonctionne en faisant
[begin:end:step]
- en laissant début et fin et en spécifiant une étape de -1, il inverse une chaîne.la source
b = a.decode('utf8')[::-1].encode('utf8')
mais merci pour la bonne direction!.decode('utf8')
nécessaire, cela signifiea
qu'il ne contient aucun objet chaîne, mais plutôt des octets.@ Paolo
s[::-1]
est le plus rapide; une approche plus lente (peut-être plus lisible, mais c'est discutable) est''.join(reversed(s))
.la source
join
il faut quand même construire la liste pour pouvoir obtenir la taille.''.join(list(reversed(s)))
peut être légèrement plus rapide.Ma propre expérience avec cette question est académique. Cependant, si vous êtes un professionnel à la recherche de la réponse rapide, utilisez une tranche qui passe par
-1
:ou plus lisiblement (mais plus lent en raison de la recherche de nom de la méthode et le fait qui se joignent forme une liste quand ils reçoivent une iterator),
str.join
:ou pour la lisibilité et la réutilisabilité, mettez la tranche dans une fonction
et alors:
Explication plus longue
Si vous êtes intéressé par l'exposition académique, veuillez continuer à lire.
Voici quelques informations sur les chaînes de Python que vous devez savoir:
En Python, les chaînes sont immuables . La modification d'une chaîne ne modifie pas la chaîne. Il en crée un nouveau.
Les cordes sont tranchables. Le découpage d'une chaîne vous donne une nouvelle chaîne d'un point de la chaîne, vers l'arrière ou vers l'avant, vers un autre point, par incréments donnés. Ils prennent la notation de tranche ou un objet tranche dans un indice:
L'indice crée une tranche en incluant un deux-points entre les accolades:
Pour créer une tranche en dehors des accolades, vous devrez créer un objet tranche:
Une approche lisible:
Bien qu'il
''.join(reversed('foo'))
soit lisible, il nécessite d'appeler une méthode de chaînestr.join
, sur une autre fonction appelée, qui peut être relativement lente. Mettons cela dans une fonction - nous y reviendrons:Approche la plus performante:
Beaucoup plus rapide utilise une tranche inverse:
Mais comment pouvons-nous rendre cela plus lisible et compréhensible pour quelqu'un de moins familier avec les tranches ou l'intention de l'auteur original? Créons un objet tranche en dehors de la notation en indice, donnons-lui un nom descriptif et passons-le à la notation en indice.
Mettre en œuvre en tant que fonction
Pour réellement implémenter cela en tant que fonction, je pense qu'il est suffisamment clair sur le plan sémantique d'utiliser simplement un nom descriptif:
Et l'utilisation est tout simplement:
Ce que votre professeur veut probablement:
Si vous avez un instructeur, il voudra probablement que vous commenciez avec une chaîne vide et que vous construisiez une nouvelle chaîne à partir de l'ancienne. Vous pouvez le faire avec une syntaxe pure et des littéraux en utilisant une boucle while:
C'est théoriquement mauvais parce que, rappelez-vous, les chaînes sont immuables - donc à chaque fois qu'il semble que vous ajoutiez un caractère à votre
new_string
, cela crée théoriquement une nouvelle chaîne à chaque fois! Cependant, CPython sait comment optimiser cela dans certains cas, dont ce cas trivial en est un.Meilleur entrainement
Théoriquement, il est préférable de rassembler vos sous-chaînes dans une liste et de les rejoindre plus tard:
Cependant, comme nous le verrons dans les timings ci-dessous pour CPython, cela prend en fait plus de temps, car CPython peut optimiser la concaténation des chaînes.
Timings
Voici les horaires:
CPython optimise la concaténation de chaînes, tandis que d'autres implémentations peuvent ne pas :
la source
while
et décrémenter l'indice, bien que ce soit peut - être moins lisible:for i in range(len(a_string)-1, -1, -1):
. Surtout j'aime que l'exemple de chaîne que vous avez choisi soit le seul cas où vous n'auriez jamais besoin de l'inverser et ne seriez pas en mesure de dire si vous l'aviez :)Réponse rapide (TL; DR)
Exemple
Réponse détaillée
Contexte
Cette réponse est fournie pour répondre à la préoccupation suivante de @odigity:
Problème
Solution
Pièges
string.reverse()
string.reverse()
pour éviter la notation par tranche.print 'coup_ate_grouping'[-4:] ## => 'ping'
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
print 'coup_ate_grouping'[-1] ## => 'g'
[-1]
peuvent décourager certains développeursRaisonnement
Python a une circonstance particulière à connaître: une chaîne est un type itérable .
Une justification de l'exclusion d'une
string.reverse()
méthode est d'inciter les développeurs de python à tirer parti de la puissance de cette circonstance particulière.En termes simplifiés, cela signifie simplement que chaque caractère individuel d'une chaîne peut être facilement exploité en tant que partie d'un arrangement séquentiel d'éléments, tout comme les tableaux dans d'autres langages de programmation.
Pour comprendre comment cela fonctionne, l'examen de example02 peut fournir un bon aperçu.
Exemple02
Conclusion
La charge cognitive associée à la compréhension du fonctionnement de la notation par tranche en python peut en effet être trop lourde pour certains adoptants et développeurs qui ne souhaitent pas investir beaucoup de temps dans l'apprentissage du langage.
Néanmoins, une fois les principes de base compris, la puissance de cette approche sur les méthodes de manipulation de chaînes fixes peut être très favorable.
Pour ceux qui pensent le contraire, il existe des approches alternatives, telles que les fonctions lambda, les itérateurs ou les simples déclarations de fonctions uniques.
Si vous le souhaitez, un développeur peut implémenter sa propre méthode string.reverse (), mais il est bon de comprendre la raison d'être de cet aspect de python.
Voir également
la source
Les réponses existantes ne sont correctes que si les modificateurs Unicode / grappes de graphèmes sont ignorés. J'y reviendrai plus tard, mais jetons d'abord un coup d'œil à la vitesse de certains algorithmes d'inversion:
Vous pouvez voir que le temps pour la liste comprehension (
reversed = string[::-1]
) est dans tous les cas de loin le plus bas (même après avoir corrigé ma faute de frappe).Inversion de chaîne
Si vous voulez vraiment inverser une chaîne dans le bon sens, c'est BEAUCOUP plus compliqué. Par exemple, prenez la chaîne suivante ( doigt brun pointant vers la gauche , doigt jaune pointant vers le haut ). Ce sont deux graphèmes, mais 3 points de code unicode. Le second est un modificateur de skin .
Mais si vous l'inversez avec l'une des méthodes indiquées, vous obtenez un doigt brun pointant vers le haut , un doigt jaune pointant vers la gauche . La raison en est que le modificateur de couleur "marron" est toujours au milieu et appliqué à tout ce qui le précède. Donc nous avons
et
Les grappes de graphèmes Unicode sont un peu plus compliquées que les simples points de code de modificateur. Heureusement, il existe une bibliothèque pour gérer les graphèmes :
et donc la bonne réponse serait
qui est aussi de loin le plus lent:
Le code
la source
1. en utilisant la notation de tranche
2. en utilisant la fonction reverse ()
3. utiliser la récursivité
la source
RecursionError: maximum recursion depth exceeded while calling a Python object
. Ex:rev_string("abcdef"*1000)
Une façon moins troublante de voir les choses serait:
En anglais [-1 :: - 1] se lit comme suit:
la source
-1
n'est toujours pas nécessaire, cependant.Inverse une chaîne en python sans utiliser reverse () ou [:: - 1]
la source
C'est aussi une façon intéressante:
ou similaire:
Une autre façon plus «exotique» en utilisant byterarray qui prend en charge .reverse ()
produira:
la source
la source
la source
Cela fonctionne en parcourant une chaîne et en affectant ses valeurs dans l'ordre inverse à une autre chaîne.
la source
Voici un pas de fantaisie:
la source
En voici un sans
[::-1]
oureversed
(à des fins d'apprentissage):vous pouvez utiliser
+=
pour concaténer des chaînes, maisjoin()
c'est plus rapide.la source
Méthode récursive:
exemple:
la source
Toutes les solutions ci-dessus sont parfaites, mais si nous essayons d'inverser une chaîne à l'aide de la boucle for en python, cela deviendra un peu délicat, alors voici comment inverser une chaîne à l'aide de la boucle for
J'espère que celui-ci sera utile à quelqu'un.
la source
C'est ma façon:
la source
Il existe de nombreuses façons d'inverser une chaîne, mais j'en ai également créé une autre juste pour le plaisir. Je pense que cette approche n'est pas si mauvaise.
la source
Cette classe utilise des fonctions magiques python pour inverser une chaîne:
Production
Référence
la source
Pour résoudre ce problème de manière programmée pour l'entretien
Production:
la source
Avec python 3, vous pouvez inverser la chaîne sur place, ce qui signifie qu'elle ne sera pas affectée à une autre variable. Vous devez d'abord convertir la chaîne en liste, puis tirer parti de la
reverse()
fonction.https://docs.python.org/3/tutorial/datastructures.html
la source
C'est une fonction inverse simple et significative, facile à comprendre et à coder
la source
Voici simplement:
imprimer "loremipsum" [- 1 :: - 1]
et certains logiquement:
production:
muspimérol
la source
Inverse une chaîne sans magie python.
la source
Bien sûr, en Python, vous pouvez faire des trucs d'une ligne très sophistiqués. :)
Voici une solution simple et polyvalente qui pourrait fonctionner dans n'importe quel langage de programmation.
la source
PRODUCTION :
la source
Vous pouvez utiliser la fonction inversée avec une liste exhaustive. Mais je ne comprends pas pourquoi cette méthode a été éliminée en python 3, était inutilement.
la source
.join
ou de quelque chose pour en faire une réponse valide[c for c in string]
équivaut àlist(string)
.