Quel est le meilleur moyen de boucler en arrière une chaîne python?
Ce qui suit semble un peu gênant pour tout le besoin de -1 offset:
string = "trick or treat"
for i in range(len(string)-1, 0-1, -1):
print string[i]
Ce qui suit semble plus succinct, mais génère-t-il réellement une chaîne inversée de manière à réduire légèrement les performances?
string = "trick or treat"
for c in string[::-1]:
print c
Voici un moyen d'inverser une chaîne sans utiliser les fonctionnalités intégrées telles que reversed
. Les valeurs de pas négatives sont inversées.
def reverse(text):
rev = ''
for i in range(len(text), 0, -1):
rev += text[i-1]
return rev
Oui, le deuxième raccourci de syntaxe crée une chaîne intermédiaire et comporte une pénalité de performance associée.
La première version est mieux écrite comme:
for index, char in enumerate(reversed(s)):
print "pos %d: %s" % (index, char)
Ce qui est facile à comprendre. Ni reversed
ni enumerate
`n'a besoin de faire une copie de la chaîne.
Veillez également à utiliser string
comme nom de variable, car il s'agit également du nom de un module de la bibliothèque standard .
string = "trick or treat"
for c in string[::-1]:
print c
Je voudrais l'utiliser. C'est probablement assez rapide bien qu'il y ait peut-être un moyen légèrement meilleur (mais j'en doute).
EDIT: En fait, avec un deuxième test utilisant un programme que j'ai piraté ensemble, reversed
est probablement la solution.
==== Results ====
Sample 1: 0.0225071907043 # Using a for loop
Sample 2: 0.0100858211517 # Using reversed
Moins de code est généralement plus rapide en Python. Heureusement, vous n'avez pas à deviner:
python -mtimeit -s"s='x'*100000" "for x in s[::-1]: pass"
100 loops, best of 3: 1.99 msec per loop
python -mtimeit -s"s='x'*100000" "for x in reversed(s): pass"
1000 loops, best of 3: 1.97 msec per loop
python -mtimeit -s"s='x'*100000" "for i in xrange(len(s)-1, 0-1, -1): s[i]"
100 loops, best of 3: 4.95 msec per loop
Donc, le code le plus court est un peu plus rapide, mais il entraîne une surcharge de mémoire.
reversed
prend un itérable et retourne un itérateur qui recule. string[::-1]
convient, mais crée une nouvelle chaîne inversée. Si vous voulez juste itérer, alors ceci sera probablement mieux:
for c in reversed(string):
print c
Si vous souhaitez utiliser la chaîne inversée par la suite, il sera préférable de la créer une fois.
string = "trick or treat"
for c in reversed(string):
print c
Fera ce que je pense que vous voulez. Il utilise un itérateur. Cela devrait fonctionner avec tout ce qui a __reveresed __ () ou __len __ () et __getitem __ () implémenté __getitem __ () devrait prendre des arguments int commençant à 0.
def reverse(text):
x = ""
for i in range(len(text)):
x = x + text[len(text)-i-1]
return x
Inverser une chaîne en Python en utilisant For Loop
outputStr = ''
a = raw_input("Enter String: ")
for i in range(len(a), 0, -1):
outputStr += a[i-1]
print outputStr
Python 3 avec les méthodes enumerate
et reversed
:
string = "trick or treat"
for i, c in enumerate(reversed(string)):
print(i, c)
Vous pouvez utiliser print (c) uniquement pour récupérer chaque caractère sans l’index.