En Python, una cadena es una secuencia de caracteres Unicode. Aunque Python admite numerosas funciones para la manipulación de cadenas, no tiene una función o método incorporado diseñado explícitamente para invertir la cadena.
>>> 'instinto'.reverse()
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'str' object has no attribute 'reverse'
La inversión de cadenas no es una operación común en la programación y generalmente se usa para codificar entrevistas.
Este artículo analiza varias formas diferentes de invertir una cadena en Python.
Usando Rebanar
Comprender cómo funciona la indexación en Python es crucial para realizar la operación String Slice. Generalmente, los números de índice se utilizan para acceder a caracteres específicos dentro de una cadena.
Hay dos tipos de indexación; indexación positiva y negativa.
Puede acceder al carácter n
, ya sea a través de un número de índice positivo 2
o a través de un número de índice negativo de -6
:
>>> print('instinto
'[2])
n
>>> print('instinto
'[-6])
n
Podemos llamar a un rango de caracteres de una cadena a través de una técnica de corte. Rebanar es la operación que extrae la secuencia de una subcadena de la cadena dada.
Sintaxis de segmento:
string[start:stop:step]
- El primer argumento especifica el índice en el que comienza la extracción. Cuando se usa un índice negativo, indica un desplazamiento desde el final de la cadena. Si se omite este argumento, el corte comienza desde el índice 0.
- El segundo argumento especifica el índice antes del cual finalizar la extracción; el resultado no incluye el
stop
elemento. Cuando se usa un índice negativo, indica un desplazamiento desde el final de la cadena. Si este argumento se omite o es mayor que la longitud de la cadena, el corte se realiza al final de la cadena. - El tercer argumento es opcional y especifica el paso del corte. Cuando
step
no se usa el argumento, el valor predeterminado es 1. Cuando se usa un valor negativo, el sector toma los elementos en orden inverso.
El resultado de dividir una cadena es una nueva cadena que contiene los elementos extraídos y la cadena original no se modifica.
Para invertir una cadena mediante el corte, omita los argumentos start
y stop
y utilice un incremento de paso negativo de -1
.
El incremento de paso negativo de -1
significa que el corte comienza en el último elemento y termina en el primer elemento, lo que da como resultado una cadena invertida.
>>> print('instinto
'[::-1])
ezixuniL
También puede definir una función personalizada y usarla para invertir cadenas:
def rev_str_thru_slicing(str_):
return str_[::-1]
INPUT_STRING = "instinto"
if __name__ == '__main__':
print("INPUT STRING -", INPUT_STRING)
print("REVERSED STRING -", rev_str_thru_slicing(INPUT_STRING))
Input String - instinto
Reversed String using Slicing - ezixuniL
Uso reversed()
de la función
La reserved()
función integrada procesa los elementos de cadena en orden inverso y devuelve un iterador invertido.
En el siguiente ejemplo, los elementos del iterador invertido se agregan a una cadena vacía usando el join()
operador:
def rev_str_thru_join_revd(STR):
return "".join(reversed(STR))
INPUT_STRING = "instinto"
if __name__ == '__main__':
print("INPUT STRING -", INPUT_STRING)
print("RESERVED STRING THROUGH JOIN & REVERSED", rev_str_thru_join_revd(INPUT_STRING))
Input String - instinto
Reserved String Through Join & Reserved Methods - ezixuniL
Usando la lista reverse()
Para invertir una cadena con el método de lista reverse()
, primero, la cadena debe convertirse en una lista usando el list
constructor. Luego, los elementos de la lista se invierten en su lugar con el reverse()
método y, finalmente, los elementos de la lista se unen en una cadena utilizando el join()
método.
Aquí hay un ejemplo:
def rev_str_thru_list_reverse(STR):
lst = list(STR)
lst.reverse()
return(''.join(lst))
INPUT_STRING = "instinto"
if __name__ == '__main__':
print("Input String -", INPUT_STRING)
print("Reserved String Through List", rev_str_thru_list_reverse(INPUT_STRING))
Input String - instinto
Reserved String Through List Reverse Method - ezixuniL
Uso de la función recursiva
En Python, una función recursiva es una función que se llama a sí misma hasta que se cumple alguna condición.
En el fragmento de código a continuación, la rev_str_thru_recursion
función se llama a sí misma hasta que la longitud de la cadena es mayor que cero. En cada llamada, la cadena se corta, dejando solo el primer carácter. Posteriormente, se concatena con los caracteres troceados.
def rev_str_thru_recursion(STR):
if len(STR) == 0:
return STR
else:
return rev_str_thru_recursion(STR[1:]) + STR[0]
INPUT_STRING = "instinto"
if __name__ == '__main__':
print("INPUT STRING -", INPUT_STRING)
print("RESERVED STRING THROUGH RECURSION", rev_str_thru_recursion(INPUT_STRING))
Análisis comparativo
En esta sección, realizaremos una comparación simple entre estos cuatro métodos definidos para identificar su eficiencia. Analizaremos el rendimiento utilizando un módulo de Python llamado "timeit". Proporciona el tiempo necesario para la ejecución de los fragmentos de código. La opción "repetir" del módulo "timeit" ayuda a repetir la ejecución del código un millón de veces. Podemos comprender la salida como el tiempo promedio que toma ejecutar el fragmento de código un millón de veces.
La tabla anterior muestra que el método Slicing es siete veces más rápido que el método List Reverse, 7,5 veces más rápido que el método Join & Reserved y 83 veces más rápido que el método recursivo. Por lo tanto, Slicing es la forma más rápida y mejor de invertir la cadena.
if __name__ == "__main__":
## Performance Calculation
import timeit
from statistics import mean
s = INPUT_STRING * 10
repeatCount = 100
SLICING_PERF = timeit.repeat(lambda: rev_str_thru_slicing(s), repeat=repeatCount)
print(min(SLICING_PERF), mean(SLICING_PERF), max(SLICING_PERF), SLICING_PERF)
J_R_PERF = timeit.repeat(lambda: rev_str_thru_join_revd(s), repeat=repeatCount)
print(min(J_R_PERF), mean(J_R_PERF), max(J_R_PERF), J_R_PERF)
LIST_PERF = timeit.repeat(lambda: rev_str_thru_list_reverse(s), repeat=repeatCount)
print(min(LIST_PERF), mean(LIST_PERF), max(LIST_PERF), LIST_PERF)
RECUR_PERF = timeit.repeat(lambda: rev_str_thru_recursion(s), repeat=repeatCount)
print(min(RECUR_PERF), mean(RECUR_PERF), max(RECUR_PERF), RECUR_PERF)
Conclusión
Python no tiene funciones integradas para invertir la cadena, pero podemos usar otros métodos para invertir la cadena. El análisis de la prueba de regresión mostró que el método de división es la forma más rápida de invertir una cadena.
0 Comentarios
Dejanos tu comentario para seguir mejorando!