Cómo invertir cadenas en Python

En esta breve guía, aprenda a invertir una cadena en Python, con ejemplos prácticos de código y mejores prácticas, utilizando la notación de división con un paso negativo, un bucle for, un bucle while, join() y reversed().

Introducción

Aunque puede que no sea algo común de hacer en cualquier escenario del mundo real, invertir cadenas es una operación bastante común que enfrentará en una entrevista de trabajo. Especialmente si está solicitando un trabajo en un lenguaje de programación que no tiene métodos integrados para invertir cadenas. Al pedirle que invierta una cadena, un entrevistador puede obtener una impresión bastante precisa de cómo aborda el análisis del problema y construye una solución desde cero.

Además, dado que puede haber muchas soluciones para este problema, esta es su oportunidad de brillar y mostrar su conocimiento de las diferentes velocidades de ejecución entre diferentes algoritmos, y así crear la mejor solución posible.

En este artículo, veremos cómo invertir una cadena en Python. Consideraremos varias soluciones posibles y las compararemos, para que pueda elegir la que mejor se adapte a sus necesidades.

Obviamente, las entrevistas no son el único lugar donde puede enfrentar la necesidad de invertir una cadena; por ejemplo, hay algunos problemas de expresiones regulares que se resuelven mucho más fácilmente cuando se trabaja con cadenas invertidas.

Cadenas en Python

String en Python es una matriz inmutable de bytes, más específicamente una secuencia de bytes que representan caracteres Unicode. En realidad, una cadena se escribe en código como una secuencia de caracteres rodeada por un par de comillas (simples o dobles), pero se almacenan internamente como una secuencia de códigos Unicode:

1
2
3
example_str = "Hello World!"
# The same as:
# example_str = 'Hello World!'

{.icon aria-hidden=“true”}

Nota: El objeto real que se usa para manejar cadenas en Python se llama objeto str. Esencialmente representa un tipo de datos de cadena.

Una característica importante de las cadenas en Python es que son inmutables, lo que significa que no se pueden modificar después de crearlas. La única forma de modificar una cadena sería crear su copia modificada, lo que complica muchas operaciones en las cadenas. No es diferente para el tema de nuestro interés particular en este artículo: la operación de revertir una cadena.

Invertir una cadena en Python

Ahora que hemos cubierto todos los conceptos básicos, podemos ver cómo invertir una cadena en Python. Como hemos dicho antes, hay varias formas de hacerlo; en este artículo, cubriremos algunas de las más utilizadas. Cada enfoque tiene sus propias fortalezas y debilidades, algunos son más eficientes pero menos legibles. Por otro lado, algunos son realmente legibles y fáciles de entender, pero a costa de no ser tan eficientes.

En las siguientes secciones invertiremos la cadena "Hello World!", que debe invertirse en "!dlroW olleH":

1
example_str = "Hello World!"

Solución recomendada: uso de la notación de sector

Otra propiedad importante de las cadenas en Python es que son rebanables. Eso significa que se puede extraer una subcadena de la cadena original, y Python ofrece una forma bastante sencilla de hacerlo usando el operador de división.

{.icon aria-hidden=“true”}

Nota: Si desea obtener más información sobre el corte de cadenas en Python, debe leer el artículo ["Python: notación de corte en cadenas"](/python-slice-notation -in-chain/ )

El operador de corte en Python tiene la siguiente sintaxis: [inicio:fin:paso]. Extrae una subcadena desde el inicio hasta el final. Si el ‘paso’ es un número positivo, el ‘inicio’ debe ser menor que el ‘final’, por lo tanto, el operador de corte crea una subcadena que se mueve hacia adelante. Por otro lado, si paso es un número negativo, la subcadena se crea yendo hacia atrás en la cadena original. Por lo tanto, si establece el paso en -1 y deja start y end en blanco, efectivamente revertirá una cadena completa:

1
2
3
example_str = "Hello World!"
reversed_str = example_str[::-1]
print(reversed_str)

Hemos usado el operador de corte en nuestro example_str de la forma descrita anteriormente, lo que nos dará la versión invertida de nuestra cadena original:

1
"!dlroW olleH"

Este enfoque para invertir una cadena en Python se considera el más eficiente para las cadenas de entrada grandes, pero eso tiene el costo de una mala legibilidad, especialmente para aquellos que no están familiarizados con la notación de corte en Python. . Para mejorar eso, podemos envolver el corte en una función, lo que aumentará la legibilidad del código final:

1
2
def reverse_string(s):
    return s[::-1]

Más tarde, usaríamos esta función en lugar del operador de corte simple para invertir la cadena deseada, y la cadena resultante será la misma que antes - "!dlroW olleH":

1
reversed_str = reverse_string(example_str)

{.icon aria-hidden=“true”}

Consejo: Envolver cada sección de un código en una función es generalmente una buena práctica. Además de mejorar la legibilidad del código, en realidad lo ayuda a crear un código más modular y reutilizable. Por lo tanto, puede incluir cada uno de los siguientes fragmentos de código en la función de la misma manera que se muestra en esta sección.

Usar join() y reversed()

Aunque el corte funciona mejor en términos de velocidad, la alternativa sólida en términos de legibilidad es combinar dos métodos integrados de Python: str.join() y reversed().

En primer lugar, reversed() devuelve un iterador invertido para la cadena pasada como argumento. Eso nos permite repasar la cadena original hacia atrás y agregar sus caracteres a la cadena vacía usando la función str.join():

1
2
3
example_str = "Hello World!"
reversed_str = ''.join(reversed(example_str))
print(reversed_str)

Esto creará una copia invertida de la cadena original:

1
"!dlroW olleH"

{.icon aria-hidden=“true”}

Nota: Si no está familiarizado con el concepto de iteradores en Python, debe leer "Introducción a los iteradores de Python"

Usar un bucle for

Los bucles también se pueden usar para invertir una cadena en Python; el primero que consideraremos es el bucle for. Podemos usarlo para iterar sobre la cadena original en ambos sentidos: hacia adelante y hacia atrás. Como queremos invertir una cadena, lo primero que se nos ocurre es iterar sobre la cadena desde el final hasta el principio y agregar cada carácter a la nueva cadena. Para ese propósito, usaremos la función reversed():

1
2
3
4
5
example_str = "Hello World!"
reversed_str = ""
for i in reversed(example_str):
    reversed_str += i
print(reversed_str)

Hemos iterado hacia atrás sobre la cadena original y agregamos cada carácter a resulting_str, que almacenará la versión invertida de example_str al final:

1
"!dlroW olleH"

{.icon aria-hidden=“true”}

Nota: Observe cómo hemos estado agregando cada carácter a la cadena invertida, pero las cadenas en Python son inmutables. Podemos hacer eso porque Python, esencialmente, crea una copia modificada de una cadena cada vez que le agregamos un carácter, antes de solidificar el resultado como una cadena inmutable y devolverlo.

Un enfoque alternativo es iterar sobre la cadena original hacia adelante, desde el principio hasta el final, y crear la versión invertida de la cadena original en el bucle mismo:

1
2
3
4
5
example_str = "Hello World!"
reversed_str = ""
for i in example_str:
    reversed_str = i + reversed_str
print(reversed_str)

Esto nos dará el mismo resultado que usar el iterador inverso en el bucle.

Usar un bucle while

Otro bucle que podemos usar para invertir una cadena es el bucle while. Este enfoque es un poco más complicado que otros, pero puede brindarle una gran idea de cómo funciona la cadena de inversión en un nivel inferior:

1
2
3
4
5
6
7
example_str = "Hello World!"
reversed_str = ""
i = len(example_str) - 1
while i >= 0:
    reversed_str += example_str[i]
    i -= 1
print(reversed_str)

Lo que resultará en:

1
"!dlroW olleH"

Conclusión

Como hemos visto en este artículo, existen muchos enfoques sobre cómo invertir una cadena en Python, y cada uno de ellos tiene sus puntos fuertes y débiles. En términos generales, la única forma que debe elegir durante la mayor parte del tiempo es el operador slicing: es la forma más eficiente y más Pythonic de invertir una cadena. Otros enfoques son menos eficientes, por lo tanto, piénselo dos veces antes de usarlos si la velocidad de ejecución es crucial en su código. ódigo.

Licensed under CC BY-NC-SA 4.0