31 votes

Comment expliquer l'inverse d'une séquence par notation de tranche a [:: - 1]

À partir de la python.org tutoriel

Tranche indices des valeurs par défaut; une omis premier indice zéro par défaut, une omis deuxième index par défaut la taille de la chaîne de tranchées.

>>> a = "hello"
>>> print(a[::-1])
olleh

Comme le tutoriel, dit - a[::-1] devrait égale à a[0:5:-1]

mais a[0:5:-1] est vide comme suit:

>>> print(len(a[0:5:-1]))
0

La question n'est pas un doublon d' expliquer la tranche de notation. Cette question est à propos de l'utilisation de découpage en python.

23voto

Chris_Rands Points 15161

Je pense que les docs sont peut-être un peu trompeur, mais les arguments optionnels de trancher en cas d'omission sont les mêmes que l'utilisation d' None:

>>> a = "hello"
>>> a[::-1]
'olleh'
>>> a[None:None:-1]
'olleh'

Vous pouvez voir que ces 2 ci-dessus, les tranches sont identiques à partir de la Disponible bytecode:

>>> import dis
>>> dis.dis('a[::-1]') # or dis.dis('a[None:None:-1]')
  1           0 LOAD_NAME                0 (a)
              3 LOAD_CONST               0 (None)
              6 LOAD_CONST               0 (None)
              9 LOAD_CONST               2 (-1)
             12 BUILD_SLICE              3
             15 BINARY_SUBSCR
             16 RETURN_VALUE

Négative) step, les valeurs substituées pour None sont len(a) - 1 de la start et -len(a) - 1 de la end:

>>> a[len(a)-1:-len(a)-1:-1]
'olleh'
>>> a[4:-6:-1]
'olleh'
>>> a[-1:-6:-1]
'olleh'

Cela peut vous aider à visualiser:

    h  e  l  l  o   
    0  1  2  3  4  5
-6 -5 -4 -3 -2 -1

3voto

IsaacDj Points 665

Il n'est de tranche. Vous chercher. start stop et étape donc, fondamentalement, vous êtes en train de dire, il devrait commencer au début jusqu'à ce que le début, mais à reculons (-1).

Si vous le faites avec -2 il va sauter lettres:

>>> a[::-2]
'olh'

Lorsque vous effectuez [0:5:-1] votre e à partir de la première lettre et de revenir directement à 5 et ainsi, il s'arrête. seulement si vous essayez [-1::-1] sera correctement être en mesure d'aller au début en faisant des étapes de négatif 1.

Edit pour répondre à des commentaires

Comme l'a souligné la documentation dit

une omis deuxième index par défaut la taille de la chaîne tranches.

Supposons que nous avons str avec len(str) = 5. Lorsque vous tranche la chaîne et de laisser tomber, laisser de côté, le deuxième numéro de la valeur par défaut est la longueur de la chaîne tranchées, dans ce cas - 5. j'.e str[1:] == str[1:5], str[2:] == str[2:5]. La phrase fait référence à la longueur de l'objet d'origine et pas le nouveau tranches de l'objet.

Aussi, cette réponse est génial

3voto

zatta Points 480

Vous êtes confus avec le comportement du stepping. Pour obtenir le même résultat, vous pouvez:

 a[0:5][::-1]
'olleh'
 

En effet, le pas veut «tourner» en arrière dans votre cas, mais vous limitez son mouvement en appelant a[0:5:-1] .

2voto

Michele Tonutti Points 2289

a[0:5:-1] n'a pas beaucoup de sens, car lorsque vous utilisez cette notation, les indices signifient: a[start:end:step] . Lorsque vous utilisez une étape négative, votre valeur finale doit être à une position "antérieure" à votre valeur de départ.

1voto

glibdud Points 5311

Vous remarquerez que la troisième tranche de l'argument, l' step, n'est pas présentée dans la partie du tutoriel que vous avez cité. Ce fragment de code suppose une étape positive.

Lorsque vous ajoutez dans la possibilité d'un négatif étape, le comportement est en fait assez intuitive. Un vide start se rapporte à n'importe quelle fin de la séquence, on pourrait commencer à l'étape par le biais de l'ensemble de la séquence dans le sens indiqué par l' step de la valeur. En d'autres termes, il se réfère à l'indice le plus bas (à compter jusqu') si vous avez une étape positive, et l'indice le plus élevé (compte à rebours) si vous avez un négatif étape. De même, un vide end se rapporte à n'importe quelle fin de la séquence, on obtiendrait après l'exécution pas à pas dans la direction appropriée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X