separar - Invierta una cadena de Python sin omitir el inicio y el final.
reemplazar caracteres en python (7)
Algunas otras formas de revertir una cadena:
word = "hello"
reversed_word1 = word[-1: :-1]
reversed_word2 = word[len(word)-1: :-1]
reversed_word3 = word[:-len(word)-1 :-1]
Una cosa que debe tener en cuenta acerca de la notación de corte a[i:j:k]
es que omitir i
y j
no siempre significa que seré 0
y j
se convertirá en len(s)
. Depende del signo de k
. Por defecto, k
es +1
.
- Si
k
es + ve, entonces el valor predeterminado dei
es0
(comenzar desde el principio). Si es -ve, el valor predeterminado dei
es-1
(comenzar desde el final). - Si
k
es + ve, entonces el valor predeterminado dej
eslen(s)
(parada al final). Si es -ve, el valor predeterminado dej
es-(len(s)+1)
(detener al principio).
Ahora puede explicar a sus alumnos cómo Hello[::-1]
imprime a olleH
.
¿Cómo se invierte una cadena de Python sin omitir los argumentos de segmento de inicio y fin?
word = "hello"
reversed_word = word[::-1]
Entiendo que esto funciona, pero ¿cómo obtendría el resultado al especificar los índices de inicio y finalización?
word = "hello"
reversed_word = word[?:?:-1]
Es difícil explicar a los alumnos por qué la word[::-1]
invierte una cadena. Es mejor si puedo darles un razonamiento lógico en lugar de "es la forma pitónica".
La forma en que explico la word[::1]
es la siguiente: "No ha especificado el inicio, por lo que solo comienza desde el principio. No ha especificado el final, por lo que solo va hasta el final. Ahora el paso es 1, por lo que solo va desde el principio hasta el final 1 carácter por 1. " Ahora, cuando mis alumnos vean la word[::-1]
, van a pensar: "¿No hemos especificado el inicio o el final, por lo que pasará por la cadena de caracteres -1 a la vez?"
Desde la fuente de Python 2 , esto se define con expresiones ternarias:
defstart = *step < 0 ? length-1 : 0; defstop = *step < 0 ? -1 : length;
Por lo tanto, cuando el inicio y la parada no se dan,
Si el paso es negativo:
- comienzo es longitud - 1
- stop es -1, (este es el índice C, difícil de implementar en Python, debe ser -length-1)
Si el paso es positivo:
- inicio es 0
- detener es longitud
Así que para responder a esta pregunta:
¿Cómo obtendría el resultado especificando los índices de inicio y finalización?
Para especificar esto usted mismo, use, por ejemplo, lo siguiente (ponga en una función para reusabilidad)
def my_slice(word, step):
''''''slice word with only step''''''
start = len(word)-1 if step < 0 else 0
stop = -len(word)-1 if step < 0 else len(word)
return word[start:stop:step]
word = "hello"
step = -1
my_slice(word, step)
devoluciones
''olleh''
La string[begin:end:increment]
notación string[begin:end:increment]
se puede describir con el siguiente programa de Python:
def myreverse( string, begin, end, increment ):
newstring = ""
if begin >= 0 and end < 0:
begin = -1
for i in xrange(begin, end, increment):
try:
newstring += string[i]
except IndexError:
pass
return newstring
No estoy seguro de por qué, pero lo siguiente devolverá el reverso de la word
:
word = "hello"
word[len(word):-(len(word)+1):-1]
O...
word = "hello"
word[len(word):-len(word)-1:-1]
Editar (Explicación):
Del comentario de jedward:
El parámetro intermedio es el más complicado, pero es bastante sencillo una vez que se da cuenta de que (a) los índices negativos para dividir el inicio / parada indican que desea contar "hacia atrás" desde el final de la cadena, y (b) el índice de parada es exclusivo, así que "contará" hasta pero se detendrá en / antes del índice de parada. word [len (word): - len (word) -1: -1] es probablemente más claro.
En respuesta a this comentario:
El tercer valor es en realidad el incremento, por lo que le está diciendo a Python que desea comenzar con la última letra y luego devolver todos los valores de (-1) st al último.
Aquí hay un dibujo (juntado en un minuto):
El dibujo muestra que también podemos usar esto en su lugar:
word = "hello"
word[-1:-len(word)-1:-1] #-1 as the first
Si no especifica un número para notación de segmento, Python usará None
como predeterminado. Entonces, simplemente puede escribir explícitamente los valores de None
:
>>> word = "hello"
>>> word[None:None:-1]
''olleh''
>>>
Enfoque recursivo:
def reverse(word):
if len(word) <= 1:
return word
return reverse(word[1:]) + word[0]
In [27]: word
Out[27]: ''hello''
In [28]: word[-1:-6:-1]
Out[28]: ''olleh''
Por qué esto funciona:
In [46]: word
Out[46]: ''hello''
In [47]: word[-1] # you want o to be your first value
Out[47]: ''o''
In [48]: word[-5] # you want h to be your last value
Out[48]: ''h''
In [49]: word[-1:-6:-1] # therefore ending point should be one
Out[49]: ''olleh'' # past your last value that is -6