La mejor manera de pasar una cadena de python hacia atrás

¿Cuál es la mejor manera de pasar una cadena de python hacia atrás?

Lo siguiente parece un poco incómodo para toda la necesidad de compensación -1:

string = "trick or treat" for i in range(len(string)-1, 0-1, -1): print string[i] 

Lo siguiente parece más conciso, pero ¿en realidad genera una cadena invertida para que haya una penalización de rendimiento menor?

 string = "trick or treat" for c in string[::-1]: print c 

Probar el incorporado invertido :

 for c in reversed(string): print c 

La llamada invertida () creará un iterador en lugar de copiar la cadena completa.

PEP 322 detalla la motivación para revertido () y sus ventajas sobre otros enfoques.

Aquí hay una forma de revertir una cadena sin utilizar las funciones integradas, como la reversed . Los valores de paso negativos se desplazan hacia atrás.

 def reverse(text): rev = '' for i in range(len(text), 0, -1): rev += text[i-1] return rev 

Sí, el segundo acceso directo de syntax crea una cadena intermedia y tiene una penalización de rendimiento asociada.

La primera versión está mejor escrita como:

 for index, char in enumerate(reversed(s)): print "pos %d: %s" % (index, char) 

Que es fácil de comprender. Ni reversed ni enumerate `necesita hacer una copia de la cadena.

También tenga cuidado al usar la string como nombre de variable, ya que también es el nombre de un módulo en la biblioteca estándar .

  string = "trick or treat" for c in string[::-1]: print c 

Yo usaría eso. Probablemente sea bastante rápido, aunque puede haber una forma ligeramente mejor (pero lo dudo).

EDITAR: En realidad, con una segunda prueba que usa un progtwig que hackeé, reversed es probablemente el camino a seguir.

  ==== Results ==== Sample 1: 0.0225071907043 # Using a for loop Sample 2: 0.0100858211517 # Using reversed 

Menos código suele ser más rápido en Python. Por suerte, no tienes que adivinar:

 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 

Así que el código más corto es un poco más rápido, pero viene con una sobrecarga de memoria.

reversed toma un iterable y devuelve un iterador que se mueve hacia atrás. string[::-1] está bien, pero crea una nueva cadena invertida. Si solo quieres iterar, entonces esto probablemente será mejor:

 for c in reversed(string): print c 

Si desea usar la cadena invertida después, crearla una vez será mejor.

 string = "trick or treat" for c in reversed(string): print c 

Haré lo que creas que quieres. Utiliza un iterador. Esto debería funcionar con cualquier cosa que haya __reverecido __ () o __len __ () y __getitem __ () implementado. __getitem __ () tendría que tomar los argumentos int a partir de 0.

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

Invertir una cadena en Python usando For Loop

 outputStr = '' a = raw_input("Enter String: ") for i in range(len(a), 0, -1): outputStr += a[i-1] print outputStr 

Python 3 con métodos enumerate e reversed :

 string = "trick or treat" for i, c in enumerate(reversed(string)): print(i, c) 

Puede usar print (c) solo para recuperar cada carácter sin el índice.