2009-04-19 36 views
32

que estaba buscando una manera de imprimir una cadena hacia atrás, y después de una búsqueda rápida en Google, me encontré con este método:revertir una cadena en Python

Supongamos 'a' es una variable de cadena. Esto devolverá la cadena 'a' al revés:

a[::-1] 

¿Alguien puede explicar cómo funciona eso?

+0

** ** Por favor Véase también: http: // stackoverflow .com/a/33457266/42223 que aborda esta característica de python que algunos pueden encontrar "peculiar". – dreftymac

Respuesta

68

Claro, el [::] es el operador extended slice. se le permite para tomar subseries. Básicamente, funciona especificando qué elementos quieres como [begin: end: step], y funciona para todas las secuencias. Dos cosas bonitas al respecto:

  • Se pueden omitir uno o más de los elementos y lo hace "lo correcto"
  • Los números negativos para comenzar, terminar, y el paso tienen un significado

Para empezar y terminar, si se le da un número negativo , significa contar desde el final de la secuencia.Por ejemplo, si tengo una lista:

l = [1,2,3] 

Entonces l[-1] es 3, l[-2] es 2, y es l[-3] 1.

para el argumento step, un número negativo significa trabajar hacia atrás a través de la secuencia. Así que para una lista ::

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

Se puede escribir l[::-1] que básicamente significa usar un tamaño de paso de -1, mientras que la lectura a través de la lista. Python "hará lo correcto" al rellenar el inicio y detenerse, por lo que recorre la lista al revés y le da [10,9,8,7,6,5,4,3,2,1].

He dado los ejemplos con listas, pero las cadenas son solo otra secuencia y funcionan de la misma manera. Entonces, a[::-1] significa construir una cadena uniendo los caracteres que obtienes caminando hacia atrás a través de la cuerda.

+0

"Lo correcto" puede ser un poco confuso cuando se usa un paso/paso negativo. [Ejemplo aquí] (http://stackoverflow.com/q/399067/936083). – Darthfett

3

Es la extended slice notation:

sequence[start:end:step] 

En este caso, la etapa -1 significa hacia atrás, y omitir el inicio y el final significa que quiere toda la cadena.

7

La parte "-1" representa la parte "paso" de la división, en este caso, pasa por la cadena 1 carácter a la vez, pero al revés (un paso negativo significa desde el final de la cadena) . Si especifica el paso para ser 2, por ejemplo, obtendría todos los demás caracteres de la cadena, empezando por la primera. Si especifica un paso de -2, obtendrá todos los demás caracteres de la cadena, empezando por el último carácter y trabajando hacia atrás.

Así, en pocas palabras, si a = '12345':

  • a[::2] convierte 135
  • a[::-1] convierte 54321
  • a[::-2] convierte 531
2

Se trata de utilizar rebanar extendida - una cadena es una secuencia en Python, y comparte algunos métodos con otras secuencias (na mely listas y tuplas). Hay tres partes para cortar: comenzar, detener y dar pasos. Todos tienen valores predeterminados: inicie los valores predeterminados a 0, detenga los valores predeterminados a len (secuencia) y los valores predeterminados de paso a 1. Al especificar [:: - 1] está diciendo "todos los elementos en la secuencia a, comenzando desde el principio , hasta el fin de ir hacia atrás uno a la vez.

Esta característica se introdujo en Python 2.3.5, y se puede leer más en el What's New docs.

2

[:: - 1] da una porción de la cadena a. la sintaxis completa es a[begin:end:step] que da un [begin], a [begin + step], ... a [end-1]. Cuando el paso es negativo, comienza al final y avanza.

Finalmente, comienza de manera predeterminada al principio de la secuencia, al final y al paso a -1.

1

una cadena es esencialmente una secuencia de caracteres, por lo que la operación de corte funciona en ella. Lo que está haciendo es de hecho:

-> obtenga una porción de 'a' de principio a fin en pasos de 1 hacia atrás.

5

creo que el siguiente hace un poco más de sentido para cadenas de impresión a la inversa, pero tal vez eso es sólo conmigo:

for char in reversed(myString): 
    print(char, end = "") 
+0

¿Para qué sirve 'end = ""'? –

+0

Es la forma de pitón 3 de no alinear al final de cada impresión. En python 2.x, puede escribir print (char,) –

+0

Por supuesto, esto imprime la cadena; no crea una nueva cadena que es la cadena anterior invertida ('' .join (reverse (myString)) hará eso, sin embargo). –

1

lo haría así:

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

e imprime: gnirts

0

Considere la siguiente lista

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

Otro truco para revertir una lista puede ser:

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

podemos usar append y pop para hacerlo

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

    return ''.join(o) 
+0

¿Por qué sugeriría un método alternativo para invertir una cadena cuando el OP claramente quería saber por qué 'a [:: - 1]' funciona? – rayryeng

+0

Esta no es la respuesta relevante, por favor lea la pregunta nuevamente. – Aniruddha

1

Se notación básica paso, tenga en cuenta la funcionalidad de:

un [ 2: 4: 2]

Lo que sucede es que el índice se divide entre la posición 2 y 4, lo que la tercera variable hace es establecer el tamaño del paso comenzando desde el primer valor En este caso, devolvería un [2], ya que a [4] es un límite superior, solo se devuelven dos valores y no se produce un segundo paso. El operador (-) menos simplemente invierte la salida del paso.

0

sin utilizar revocada, o [:: - 1], que aquí hay una versión simple basado en la repetición i que consideraría ser la más legible:

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]