inverser une chaîne en Python
je cherchais un moyen pour imprimer une chaîne à l'envers, et après une recherche rapide sur google, j'ai trouvé cette méthode:
Suppose ' a ' est une variable chaîne. Cela retournera la chaîne de caractères' a 'à l'envers:
a[::-1]
est-ce que quelqu'un peut expliquer comment cela fonctionne?
13 réponses
bien sûr, le [::]
est le tranche prolongée opérateur. Il vous permet de prendre des sous-chaînes. Fondamentalement, il fonctionne en spécifiant les éléments que vous voulez comme [début:fin:pas], et il fonctionne pour toutes les séquences. Deux choses soignées à ce sujet:
- Vous pouvez omettre l'un ou plusieurs des éléments et il n' "la bonne chose"
- les nombres négatifs pour begin, end et step ont un sens
pour begin et end, 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]
puis 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 à travers la séquence. Donc, pour une liste::
l = [1,2,3,4,5,6,7,8,9,10]
vous pourriez écrire l[::-1]
qui signifie essentiellement d'utiliser une taille de pas de -1 en lisant la liste. Python va "faire la bonne chose "en remplissant le start et le stop ainsi il itère à travers la liste à l'envers et vous donne [10,9,8,7,6,5,4,3,2,1]
.
j'ai donné les exemples avec des listes, mais les chaînes sont juste 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 marchant à reculons à travers la chaîne.
la partie" -1 "représente la partie" step " du découpage-dans ce cas, elle passe par le caractère string 1 à la fois, mais en arrière (un pas négatif signifie démarrer à la fin de la chaîne). Si vous spécifiez l'étape à 2, par exemple, vous obtiendrez tous les autres caractères de la chaîne, en commençant avec la première. Si vous spécifiez un pas de -2, alors vous obtiendriez tous les autres caractères de la chaîne, en commençant par le dernier caractère et en travaillant à l'envers.
Donc, en un mot, si a = '12345'
:
-
a[::2]
devient135
-
a[::-1]
devient54321
-
a[::-2]
devient531
je pense que ce qui suit fait un peu plus de sens pour les chaînes d'impression à l'envers, mais peut-être que c'est juste moi:
for char in reversed( myString ):
print( char, end = "" )
c'est la notation de tranche prolongée :
sequence[start:end:step]
dans ce cas, step -1 signifie en arrière, et omettre le début et la fin signifie que vous voulez la chaîne entière.
il s'appelle Slice Notation en Python et vous pouvez lire un peu plus sur la façon dont il fonctionne ici:
il utilise le découpage étendu - une chaîne est une séquence en Python, et partage certaines méthodes avec d'autres séquences (à savoir listes et tuples). Il y a trois parties à trancher - démarrer, arrêter et marcher. Tous ont des valeurs par défaut-start par défaut à 0, stop par défaut à len (sequence), 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 remontant un à la fois.
cette caractéristique a été introduit en python 2.3.5, et vous pouvez lire plus dans le Quoi de neuf docs .
[:: -1] donne une tranche de la chaîne A. la syntaxe complète est a[begin:end:step]
ce qui donne un[commencer], [begin+step], ... [fin-1]. Lorsque step est négatif, vous commencez à la fin et vous déplacez pour commencer.
enfin, begin par défaut au début de la séquence, end to the end, et step to -1.
une chaîne est essentiellement une séquence de caractères et donc le découpage de fonctionnement. Ce que vous faites est en fait:
- > obtenir une tranche de " a " du début à la fin par Pas de 1 en arrière.
je le ferais comme ceci:
variable = "string"
message = ""
for b in variable:
message = b+message
print (message)
et il imprime: gnirts
C'est l'étape de base de la notation, envisager la fonctionnalité:
[2:4:2]
ce qui se passe, c'est que l'indice est tranché entre la position 2 et la position 4, ce que fait la troisième variable, c'est qu'elle définit la taille du pas à partir de la première valeur. Dans ce cas, il retournerait a[2], puisque a[4] est une limite supérieure, seulement deux valeurs sont retournées et aucune deuxième étape n'a lieu. L'opérateur ( - ) minus inverse simplement la sortie step.
Examiner 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]
nous pouvons utiliser append et pop de le faire
def rev(s):
i = list(s)
o = list()
while len(i) > 0:
o.append(t.pop())
return ''.join(o)
sans utiliser inversé ou [:: -1], voici une version simple basée sur la récursion que je considérerais 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]