Header Ads Widget

Cómo invertir una cadena en Python

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 2o 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 stopelemento. 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 stepno 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 startstopy utilice un incremento de paso negativo de -1.

El incremento de paso negativo de -1significa 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 listconstructor. 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_recursionfunció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.

MétodosTiempo de ejecuciónRelación de comparación Calc.
rebanar0.231x
Lista inversa1.637x
Unirse y reservar1.737.5x
recursividad19.1983x

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.

Los resultados anteriores son el análisis comparativo de los métodos discutidos para invertir la cadena en el mismo entorno. Los números pueden variar en diferentes entornos informáticos, pero la proporción probablemente seguirá siendo la misma.
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.


Publicar un comentario

0 Comentarios