web-dev-qa-db-fra.com

Chaîne inverse: la chaîne [:: - 1] fonctionne, mais la chaîne [0 :: - 1] et d'autres ne le font pas

Je suis un peu novice en python/programmation, et je viens de jouer avec le découpage de chaînes. Donc, la simple méthode inverse de chaîne de string[::-1] fonctionne très bien comme nous le savons, mais il y a d'autres exemples dans mon code ci-dessous qui donnent des résultats inattendus:

In [1]: string = "Howdy doody"

In [2]: string[::]
Out[2]: 'Howdy doody'

In [3]: string[::-1]
Out[3]: 'ydood ydwoH'

In [4]: string[0:]    
Out[4]: 'Howdy doody'

In [5]: string[0::-1]
Out[5]: 'H'     # what up with this?

In [6]: string[:len(string)]
Out[6]: 'Howdy doody'

In [7]: string[:len(string):-1]
Out[7]: ''     # what up with this too?

In [8]: string[0:len(string)]
Out[8]: 'Howdy doody'

In [9]: string[0:len(string):-1]
Out[9]: ''    # And what up here too.

J'ai commenté sur les lignes ci-dessus où je m'attendais à ce que les chaînes soient inversées, mais je suis surpris de voir pourquoi elles ne renversent pas simplement la chaîne. Quelqu'un sait ce qui se passe avec ça?

27
Darren Haynes

La notation de tranche "[a: b: c]" signifie "compter par incréments de c à partir de a inclus, jusqu'à b exclusif". Si c est négatif, vous comptez à rebours, s'il est omis, c'est 1. Si a est omis, vous commencez autant que possible dans la direction à partir de laquelle vous comptez (c'est donc le début si c est positif et la fin est négative). Si b est omis, vous vous arrêtez autant que possible dans la direction vers laquelle vous comptez (c'est donc la fin si c est positif et le début s'il est négatif). Si a ou b est négatif, c'est un décalage par rapport à la fin (-1 étant le dernier caractère) au lieu du début.

OK, donc string[0::-1] Est un caractère, il dit "compter en arrière à partir de l'index 0 autant que vous le pouvez". Autant que possible, c'est le début de la chaîne.

string[0:len(string):-1] ou d'ailleurs string[0:anything:-1] est subtilement différent. Il est vide pour la même raison que string[1:0] Est vide. La fin désignée de la tranche ne peut pas être atteinte depuis le début. Vous pouvez penser à cela comme si la tranche s'était terminée "avant" qu'elle a commencé (donc elle est vide), ou vous pouvez penser que le point final est automatiquement ajusté pour être égal au point de départ (donc la tranche est vide).

string[:len(string):-1] signifie "compter en arrière de la fin jusqu'à mais sans inclure l'index len(string)". Cet index ne peut pas être atteint, la tranche est donc vide.

Vous n'avez pas essayé string[:0:-1], Mais cela signifie "compter à rebours de la fin jusqu'à mais sans inclure l'index 0". C'est tout sauf le premier caractère, inversé. [:0:-1] Est à [::-1] Comme [0:len(string)-1] est à [:]. Dans les deux cas, la fin exclue de la tranche est l'index qui aurait été le dernier caractère inclus de la tranche avec la fin omise.

Vous n'avez pas non plus essayé string[-1::-1], Qui est identique à string[::-1] Car -1 Signifie le dernier caractère de la chaîne.

48
Steve Jessop

Dans tous vos cas qui ne fonctionnent pas, vous êtes début au début puis déplacez vers l'arrière. Il n'y a pas plus en arrière que le début, donc vous n'obtenez plus de personnages.

Ce serait la solution:

>>> string[len(string)::-1]
'ydood ydwoH'

La notation de tranche est start, end, step. Lorsque step est négatif, start doit être supérieur à end pour obtenir quoi que ce soit. Où il est laissé vide ([::-1]), cette nuance est automatiquement suivie

Dans le cas où vous n'avez obtenu que 'H', il peut être déroutant pourquoi il y avait quelque chose . Mais pensez à l'explication écrite:

Commençant par le caractère à début, incrémenté de étape jusqu'à (mais sans inclure) fin

Maintenant, il devient clair que parce que vous commencez par 0, le caractère 0 est inclus

17
mhlester