Comprender la inversión de cuerdas mediante corte
Pregunta
Estaba buscando una manera de imprimir una cadena al revés y después de una búsqueda rápida en Google, encontré este método:
Suponer a
es una variable de cadena.Esto devolverá el a
cuerda al revés :
a[::-1]
¿Alguien puede explicar cómo funciona eso?
Solución
Claro, el [::]
es la extendió operador de parte . Se le permite tomar subcadenas. Básicamente, funciona especificando cuáles son los elementos que desea como [begin: final: paso], y funciona para todas las secuencias. Dos cosas interesantes acerca de él:
- 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 significado
Para empezar y terminar, si se le da un número negativo, que 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 l[-3]
es 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 "hacer lo correcto" al rellenar el arranque y parada por lo que itera por la lista hacia atrás y le da [10,9,8,7,6,5,4,3,2,1]
.
Me he dado los ejemplos con las listas, pero las cadenas son más que otra secuencia y funcionan de la misma manera. Así a[::-1]
significa construir una cadena uniendo los caracteres que se obtiene al caminar hacia atrás a través de la cadena.
Otros consejos
El "-1" parte representa la parte de "paso" del corte en lonchas, en este caso, va a través de la cadena de caracteres 1 a la vez, pero hacia atrás (un paso negativo significa empezar desde el final de la cadena). Si especifica el paso a ser 2, por ejemplo, se llega a todos los personajes de la cadena, empezando por el primero. Si especifica un paso de -2, entonces se obtendría cualquier otro carácter de la cadena, empezando por el último carácter y trabajar hacia atrás.
Así, en pocas palabras, si a = '12345'
:
-
a[::2]
convierte135
-
a[::-1]
convierte54321
-
a[::-2]
convierte531
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 = "" )
Es la extendida notación rebanada :
sequence[start:end:step]
En este caso, la etapa -1 significa hacia atrás, y omitiendo el inicio y el final significa que desea toda la cadena.
Se llama notación de corte en Python y se puede leer un poco más de cómo funciona aquí:
Es usando slicing extendida - una cadena es una secuencia en Python, y comparte algunos métodos con otras secuencias (es decir, listas y tuplas). Hay tres partes para rebanar - iniciar, detener y pasos. Todos ellos tienen valores por defecto - empezar por defecto es 0, parada por defecto a len (secuencia), y el paso por defecto es 1. Al especificar [:: - 1] que está diciendo "todos los elementos en una secuencia, 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 Novedades docs .
[:: - 1] da una porción de la cadena a. La sintaxis completa es a[begin:end:step]
lo que da una [empezar], un [+ comenzará paso], ... un [end-1]. Cuando la etapa es negativo, se inicia en el extremo y se mueven a comenzar.
Finalmente, comenzar valores predeterminados para el comienzo de la secuencia, extremo al extremo, y paso a -1.
lo haría así:
variable = "string"
message = ""
for b in variable:
message = b+message
print (message)
e imprime: gnirts
una cadena es esencialmente una secuencia de caracteres por lo que la operación de corte trabaja en ella. Lo que está haciendo en realidad es:
-> obtener una rebanada de 'a' de principio a fin en pasos de 1 hacia atrás
.Es la notación básica paso, considerar la funcionalidad de:
a [2: 4: 2]
Lo que sucede es que se rodajas el índice entre la posición 2 y 4, lo que hace la tercera variable se establece el tamaño de paso a partir del primer valor. En este caso se volvería un lugar [2], puesto que una [4] es un límites superiores sólo dos valores son de retorno y no segundo paso toma. El (-) menos operador simplemente invierte la salida de paso
.Considere la lista a continuación
l=[12,23,345,456,67,7,945,467]
Otro truco para invertir 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]
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)
Sin utilizar invertido o [:: - 1], aquí es una versión simple basado en la repetición i consideraría como 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]
Uso de sintaxis rebanada extendida
word = input ("Type a word which you want to reverse: ")
def reverse(word):
word = word[::-1]
return word
print (reverse(word))
Puede utilizar la función inversa (). Por ejemplo
x = "abcd"
for i in reversed(x):
print(i, end="")
print("\n")
L = [1,2,3]
for i in reversed(L):
print(i, end="")
impresiones dcba
y 321
la primera forma predeterminada dos límites a 0 y la longitud de la secuencia, como antes, y un paso de -1 indica que la rebanada debe ir de derecha a izquierda en lugar de la habitual izquierda a derecha. El efecto, por lo tanto, es invertir la secuencia.
name="ravi"
print(name[::-1]) #ivar