web-dev-qa-db-fra.com

inverser une chaîne en Python

Je cherchais un moyen d'imprimer une chaîne à l'envers, et après une recherche rapide sur Google, j'ai trouvé cette méthode:

Supposons que 'a' soit une variable de chaîne. Cela retournera la chaîne 'a' à l'envers:

a[::-1]

Quelqu'un peut-il expliquer comment cela fonctionne?

33
liewl

Bien sûr, le [::] est l'opérateur tranche étendue . Il vous permet de prendre des sous-chaînes. En gros, cela fonctionne en spécifiant les éléments que vous voulez comme [begin: end: step], et cela fonctionne pour toutes les séquences. Deux choses intéressantes à ce sujet:

  • Vous pouvez omettre un ou plusieurs des éléments et cela fait "la bonne chose"
  • Les nombres négatifs pour début, fin et étape ont une signification

Pour commencer et terminer, si vous donnez un nombre négatif, cela signifie compter à partir de la fin de la séquence. Par exemple, si j'ai une liste:

l = [1,2,3]

Alors l[-1] est 3, l[-2] est 2 et l[-3] est 1. 

Pour l'argument step, un nombre négatif signifie travailler en arrière dans la séquence. Donc pour une liste ::

l = [1,2,3,4,5,6,7,8,9,10]

Vous pourriez écrire l[::-1], ce qui signifie en gros utiliser une taille de pas de -1 lors de la lecture de la liste. Python "fera le bon choix" lors de la saisie du début et de la fin, afin de parcourir la liste en arrière et de vous donner [10,9,8,7,6,5,4,3,2,1]

J'ai donné les exemples avec des listes, mais les chaînes ne sont qu'une autre séquence et fonctionnent de la même manière. Donc, a[::-1] signifie construire une chaîne en joignant les caractères que vous obtenez en revenant en arrière dans la chaîne. 

72
Rick Copeland

La partie "-1" représente la partie "pas à pas" du découpage. Dans ce cas, elle passe d'un caractère à l'autre, mais en arrière (un pas négatif signifie un début à la fin de la chaîne). Si vous spécifiez le pas 2, par exemple, vous obtiendrez tous les autres caractères de la chaîne, en commençant par le premier. Si vous spécifiez un pas de -2, vous obtiendrez tous les autres caractères de la chaîne, en commençant par le dernier caractère et en procédant à l'envers.

Donc, en un mot, si a = '12345':

  • a[::2] devient 135
  • a[::-1] devient 54321
  • a[::-2] devient 531
7
hbw

Je pense que ce qui suit est un peu plus logique pour les chaînes imprimées à l'envers, mais c'est peut-être juste moi:

for char in reversed( myString ):  
  print( char, end = "" )
5
Stefan Kendall

C'est la notation de tranche étendue :

sequence[start:end:step]

Dans ce cas, étape -1 signifie en arrière et omettre le début et la fin signifie que vous voulez toute la chaîne.

3
Steve Jessop

Cela s'appelle Slice Notation en Python et vous pouvez lire un peu plus comment ça marche ici:

Expliquer la notation de tranche de Python

2
Gary Willoughby

Il utilise un découpage étendu - une chaîne est une séquence en Python et partage certaines méthodes avec d'autres séquences (notamment des listes et des n-uplets). Le découpage en tranches comporte trois parties: démarrer, arrêter et faire un pas. Tous ont des valeurs par défaut: start par défaut, 0, stop par défaut, len (séquence) et step par défaut, 1. En spécifiant [:: - 1], vous dites "tous les éléments de la séquence a, à partir du début , jusqu’à la fin, en revenant un à un.

Cette fonctionnalité a été introduite dans Python 2.3.5 et vous pouvez en lire plus dans la documentation What's New .

2
Adam

[:: - 1] donne une tranche de la chaîne a. La syntaxe complète est a[begin:end:step] Ce qui donne un [begin], un [begin + step], ... a [end-1]. Quand l'étape est négative, vous commencez à la fin et vous commencez.

Enfin, begin commence par défaut au début de la séquence, se termine à la fin et passe à -1.

2
Andrew Jaffe

C'est la notation de base, considérez les fonctionnalités de:

un [2: 4: 2]

Ce qui se passe si l’indice est découpé entre les positions 2 et 4, la troisième variable définit la taille du pas à partir de la première valeur. Dans ce cas, il renverrait un [2], puisqu'un [4] est une limite supérieure, seules deux valeurs sont renvoyées et aucune deuxième étape n'a lieu. L'opérateur (-) moins inverse simplement la sortie pas à pas.

1
Oliver

Je le ferais comme ça:

variable = "string"
message = ""
for b in variable:
    message = b+message
print (message)

et ça imprime: gnirts

1
irnus44

une chaîne de caractères est essentiellement une séquence de caractères et l’opération de découpage s’y applique. Ce que vous faites est en fait:

-> obtenez une tranche de 'a' du début à la fin par incréments de 1 en arrière.

1
fengshaun

nous pouvons utiliser append et pop pour le faire

def rev(s):
    i = list(s)
    o = list()
    while len(i) > 0:
        o.append(t.pop())

    return ''.join(o)
0
tony

Utilisation de la syntaxe de tranche étendue

Word = input ("Type a Word which you want to reverse: ")
def reverse(Word):
  Word = Word[::-1]
  return Word
print (reverse(Word))
0
Dev Ranjan

Considérez la liste ci-dessous

l=[12,23,345,456,67,7,945,467]

Une autre astuce pour inverser une liste peut être:

l[len(l):-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]

l[:-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]

l[len(l)::-1] [467, 945, 7, 67, 456, 345, 23, 12]
0

Sans utiliser reverse ou [:: - 1], voici une version simple basée sur la récursion que je considère comme la plus lisible:

def reverse(s):

  if len(s)==2:
    return s[-1] + s[0]

  if len(s)==1:
    return s[0]

  return s[-1] + reverse(s[1:len(s)-1]) + s[0]
0
Joc Cing Tay