web-dev-qa-db-fra.com

Meilleure façon de boucler une chaîne python en arrière

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
33
clwen

Essayez le inversé intégré:

for c in reversed(string):
     print c

L'appel reverse () fera un itérateur plutôt que de copier la chaîne entière. 

PEP 322 détaille la motivation de reverse () et ses avantages par rapport à d'autres approches.

65

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
5
Nathan

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 .

4
Triptych
 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
3
AJ00200

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.

3
Jochen Ritzel

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.

2
Cat Plus Plus
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.

2
krousey
def reverse(text):
    x = ""
    for i in range(len(text)):
        x = x + text[len(text)-i-1]
    return x
1
praveen

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
1
Akshay Malhotra

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.

0
ian0411