invertir - reverse string python 2
La cadena inversa: la cadena[::-1] funciona, pero la cadena[0::-1] y otras no (2)
Soy algo así como un novato / programador de python, y acabo de jugar con el corte de cuerdas. Por lo tanto, el método inverso de cadena simple de string[::-1]
funciona bien como sabemos, pero hay otras instancias en mi código a continuación que producen resultados inesperados:
In [1]: string = "Howdy doody"
In [2]: string[::]
Out[2]: ''Howdy doody''
In [3]: string[::-1]
Out[3]: ''ydood ydwoH''
In [4]: string[0:]
Out[4]: ''Howdy doody''
In [5]: string[0::-1]
Out[5]: ''H'' # what up with this?
In [6]: string[:len(string)]
Out[6]: ''Howdy doody''
In [7]: string[:len(string):-1]
Out[7]: '''' # what up with this too?
In [8]: string[0:len(string)]
Out[8]: ''Howdy doody''
In [9]: string[0:len(string):-1]
Out[9]: '''' # And what up here too.
He comentado sobre las líneas de arriba donde esperaba que las cadenas se invirtieran, pero me sorprende ver por qué no simplemente invierten la cadena. Alguien sabe que pasa con eso?
En todos los casos que no funcionan, empiezas por el principio y luego retrocedes . No hay más al revés que el principio, así que no obtendrás más personajes.
Esta sería la solución:
>>> string[len(string)::-1]
''ydood ydwoH''
La notación de corte es start
, end
, step
. Donde el step
es negativo, el start
debe ser mayor que el end
para obtener algo. Donde se deja en blanco ( [::-1]
), ese matiz se sigue automáticamente
En el caso en que solo obtuviste ''H''
, puede ser confuso por qué había algo . Pero piense en la explicación escrita:
Comenzando con el carácter al inicio , incrementa por paso hasta que finalice (pero no incluido)
Ahora queda claro que al comenzar con 0, se incluye el carácter 0
La notación de corte "[a: b: c]" significa "conteo en incrementos de c
comienza en a
inclusivo, hasta b
exclusivo". Si c
es negativo, se cuenta al revés, si se omite, es 1. Si se omite a, entonces se comienza lo más lejos posible en la dirección en la que se está contando (por lo tanto, el inicio si c
es positivo y el final si es negativo). Si se omite b
, termina lo más lejos posible en la dirección en la que estás contando (de modo que ese es el final si c
es positivo y el comienzo si es negativo). Si a
o b
es negativo, es un desplazamiento desde el final (-1 es el último carácter) en lugar del inicio.
OK, entonces la string[0::-1]
es un carácter, dice "contar hacia atrás desde el índice 0 hasta donde puedas". En la medida de lo posible es el comienzo de la cadena.
string[0:len(string):-1]
o para esa string[0:anything:-1]
materia string[0:anything:-1]
es sutilmente diferente. Está vacío por la misma razón que la string[1:0]
está vacía. El final designado de la división no se puede alcanzar desde el principio. Puede pensar en esto como el segmento que terminó "antes" de que empezara (por lo tanto, está vacío), o puede pensar en que el punto final se ajusta automáticamente para que sea igual al punto de inicio (por lo tanto, el sector está vacío).
string[:len(string):-1]
significa "contar hacia atrás desde el final hasta pero sin incluir el índice de len(string)
". No se puede alcanzar ese índice, por lo que la división está vacía.
No probaste la string[:0:-1]
, pero eso significa "contar hacia atrás desde el final hasta pero sin incluir el índice 0". Así que eso es todo excepto el primer personaje, invertido. [:0:-1]
es a [::-1]
como [0:len(string)-1]
es a [:]
. En ambos casos, el extremo excluido de la división es el índice que habría sido el último carácter incluido de la división con el final omitido.
Tampoco probaste la string[-1::-1]
, que es lo mismo que la string[::-1]
porque -1
significa el último carácter de la cadena.