Programas de Python en operaciones con cadenas

En este tutorial, escribirá programas en Python para resolver preguntas frecuentes sobre operaciones con cadenas.

Aprenderá cómo verificar si las cadenas de Python son palíndromos, anagramas y están en el caso del título.

Cadenas de Python: una revisión rápida

En Python, las cadenas son poderosos tipos de datos integrados. Pueden almacenar una secuencia de caracteres.

Indexación en cadenas de Python: como todos los iterables de Python, las cadenas también están indexadas a cero. Entonces, los índices válidos para una cadena de longitud N son 0, 1, 2 hasta N – 1.

Python también admite la indexación negativa para acceder a elementos desde el final de la cadena. Entonces, -1 es el índice del último carácter de la cadena, -2 es el índice del penúltimo carácter de la cadena, y así sucesivamente.

Inmutabilidad de las cadenas de Python: además, las cadenas de Python son inmutables, por lo que no puede modificarlas en su lugar. Sin embargo, puede llamar a varios métodos de cadena en ellos y obtener copias de cadenas con el resultado deseado.

Ahora que hemos revisado los conceptos básicos de las cadenas de Python, procedamos a resolver algunos problemas simples pero interesantes.

Empecemos.

Comprobar si una cadena de Python es un palíndromo

Problema: dada una cadena de Python, verifique si es o no un palíndromo.

En caso afirmativo, devuelva Verdadero; de lo contrario, devuelve Falso.

Así que nuestro primer problema es verificar si una cadena dada es o no un palíndromo.

Un palíndromo es una cadena que se lee igual de izquierda a derecha que de derecha a izquierda. Enumeremos algunos ejemplos: coche de carreras, referencia, nivel, señora, radar, etc.

Estos son los pasos para resolver este problema:

  • Obtenga una copia invertida de la cadena y guárdela en otra variable, si es necesario.
  • Compara los valores de la cadena original y la cadena invertida.
  • Si son iguales, la cuerda es un palíndromo. Así que devuelve True y detente.
  • Si las copias original e invertida no son iguales, la cuerda no es un palíndromo. Así que deberíamos devolver Falso.

La operación clave es obtener una copia invertida de la cadena. En Python, hay algunas formas diferentes de hacer esto.

Sin embargo, repasaremos dos enfoques:

  • Usando el corte de cuerdas
  • Usando la función invertida() y el método join()

Cómo invertir una cadena de Python usando Slicing

La sintaxis [start: stop: step] devuelve un segmento de la cadena desde el inicio hasta el final pero sin incluirlo, con un paso de tamaño de paso.

  • Si omite start, el segmento comienza al principio de la cadena.
  • Si no especifica el índice de parada, el segmento se extiende hasta el final de la cadena.
  • Y los valores negativos de step se pueden usar para devolver segmentos a partir del final de la cadena.

Así que [::-1] devuelve una copia invertida de la cadena.

La siguiente celda de código contiene la definición de la función is_palindrome().

Toma una cadena como argumento y devuelve True o False dependiendo de si es o no un palíndromo.

Aquí, hemos utilizado el corte de cadenas para obtener una copia inversa de la cadena.

def is_palindrome(this_str):
  rev_str = this_str[::-1]
  if (this_str == rev_str):
    return True
  else:
    return False

▶️ Ahora que hemos definido la función, podemos continuar y llamar con cualquier cadena válida como argumento.

is_palindrome("racecar")
True

En la celda de código anterior, racecar es un palíndromo. Entonces la función is_palindrome() devuelve True como se esperaba.

Ahora, intente llamar a la función con cualquier cadena que no sea un palíndromo, como río.

is_palindrome("river")
False

Y como puede ver, devuelve False, lo cual es correcto. ✅

Cómo invertir una cadena de Python usando reversed() y join()

En Python, puede usar el método join() junto con la función reversed() para invertir una cadena.

  • La función reversed() devuelve un iterador inverso a través de los caracteres de la cadena.
  • El método join() se puede usar para unir esos caracteres en el orden inverso.

Usando el método anterior, puede reescribir la función is_palindrome() como en la celda de código a continuación.

def is_palindrome(this_str):
  rev_str="".join(reversed(this_str))
  if (this_str == rev_str):
    return True
  else:
    return False

También puede usar la función is_palindrome() dentro de la comprensión de listas para recopilar todos los palíndromos de una lista más larga de cadenas.

str_list = ["refer","blue","level","12321","dragon"]

palindromes = [string for string in str_list if is_palindrome(string)]
print(palindromes)
# Output
['refer', 'level', '12321']

Así es como funciona el código anterior:

  • Recorra str_list, llame a is_palindrome() en cada cadena.
  • Si is_palindrome() devuelve True, agregue la cadena a la lista de palíndromos.

Como puede ver en el resultado anterior, palindromes es una lista de todas las cadenas palindrómicas en str_list.

Comprobar si dos cadenas de Python son anagramas

Otra pregunta popular que puede encontrar en las entrevistas es verificar si un par de cadenas str1 y str2 son anagramas o no.

Se dice que dos cadenas son anagramas si el número de caracteres en las dos cadenas es exactamente el mismo. Esto significa que puede obtener una de las cadenas permutando o reorganizando los caracteres de la otra cadena.

Los ejemplos de anagramas incluyen state-taste, save-vase, elbow-below, etc.

Cómo buscar anagramas usando el objeto de contador en Python

Una forma simple e intuitiva es calcular el número de ocurrencias de cada carácter en las dos cadenas. Y luego verifique si los conteos son iguales.

Esto se puede hacer más fácilmente utilizando el objeto Contador del módulo itertools. los Encimera El objeto devuelve un diccionario de Python: con los caracteres como claves y los recuentos correspondientes como valores.

Considere las cadenas «guardar» y «florero» como se muestra a continuación.

str1 = "save"
str2 = "vase"

Aquí, c1 y c2 son objetos de contador que contienen los recuentos de caracteres de las cadenas str1 y str2 respectivamente.

from collections import Counter
c1 = Counter(str1)
c2 = Counter(str2)
print(c1)
print(c2)
c1 == c2

# Output
Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1})
Counter({'v': 1, 'a': 1, 's': 1, 'e': 1})
True

c1 == c2 devuelve True ya que str1 y str2 son anagramas.

Usando esta lógica, ahora podemos continuar y definir la función are_anagrams() con dos parámetros palabra1 y palabra2. En el cuerpo de la función, comprobamos si Contador(palabra1) == Contador(palabra2).

def are_anagrams(word1, word2):
  if Counter(word1) ==  Counter(word2):
    return True
  else:
    return False

▶️ Para verificar, llama a are_anagrams() con str1, str2 como argumentos. Como str1 y str2 son anagramas («guardar» y «jarrón»), la función devuelve True, lo cual es correcto.

are_anagrams(str1, str2)
True

Cómo buscar anagramas usando copias ordenadas de cadenas

Hay otra manera de hacer esto.

Si dos cadenas son anagramas, entonces sus copias ordenadas son iguales.

Entonces podemos reescribir la función are_anagrams() para verificar si la versión ordenada de str1 es la misma que la copia ordenada de str2. Si son iguales, entonces las dos cadenas son anagramas; de lo contrario, no lo son.

Usando el método anterior para verificar la igualdad de las copias ordenadas, podemos reescribir la función are_anagrams() de la siguiente manera.

def are_anagrams(word1, word2):
  if sorted(word1) ==  sorted(word2):
    return True
  else:
    return False

Hagamos ahora algunas llamadas a funciones.

  • Las cadenas «codo» y «debajo» son anagramas y la función are_anagrams() devuelve True.
  • Y «estado» y «probado» no son anagramas, y la función devuelve Falso.
are_anagrams("below","elbow")
True

are_anagrams("state","tasted")
False

Comprobar si una cadena de Python está en mayúsculas y minúsculas

Aquí está nuestra pregunta final para este tutorial.

Problema: dada una cadena: el nombre de una persona, con nombre y apellido.

Debe verificar si la primera letra del nombre y el apellido están en mayúscula.

Este tipo de mayúsculas y minúsculas en las que la primera letra de cada palabra se escribe en mayúsculas se denomina caso de título.

Así que tienes que comprobar si el nombre está en mayúsculas y minúsculas:

1. En caso afirmativo, envíe un mensaje de que el formato está en mayúsculas y minúsculas.

2. De lo contrario, devuelva una copia de la cadena formateada en el caso del título

  • Python tiene un método de cadena incorporado istitle(), que verifica si una cadena está en el caso del título.

.istitle() devuelve True si la cadena está formateada en el caso del título; de lo contrario, devuelve False.

  • Y el método de cadena title() de Python devuelve una copia de la cadena formateada en el caso del título.

Así que ahora puedes usar estos dos métodos para resolver el problema.

Defina una función check_titlecase() que acepte el nombre como argumento.

  • Puede llamar al método istitle() en la cadena de entrada para comprobar si está formateada en mayúsculas y minúsculas.
  • Si es Verdadero, puede imprimir que la cadena ya está en mayúsculas y minúsculas.
  • De lo contrario, puede llamar al método title() y devolver una copia de la cadena en el caso del título.

La siguiente celda de código muestra la definición de la función check_titlecase().

def check_titlecase(name):
  if name.istitle():
    print(f"'{name}' is already formatted in title case.")
  else:
    return name.title()

Llamemos ahora al método check_titlecase() con un argumento.

check_titlecase("jane smith")

# Output
Jane Smith

En el resultado anterior, puede ver que la cadena «Jane Smith» ahora está en el caso del título.

▶️ Tomemos otro ejemplo.

check_titlecase("agatha Christie")

# Output
Agatha Christie

Esta vez, llamemos a la función con una cadena en mayúsculas y minúsculas.

check_titlecase("Grace Hopper")

# Output
'Grace Hopper' is already formatted in title case.

Recibimos una notificación de que la cadena está formateada en el caso del título y la función funciona como se esperaba.

Conclusión 👩‍🏫

Ahora resumamos los problemas que hemos discutido hasta ahora.

  • Para comprobar si una cadena es un palíndromo, compruebe si la cadena y su versión invertida son iguales. Puede utilizar el corte de cadenas o métodos integrados para invertir las cadenas.
  • Para comprobar si dos cadenas son anagramas, compruebe si sus copias ordenadas son iguales. Y para ordenar una cadena, use la función sorted() incorporada.
  • Para verificar si un nombre está en mayúsculas y minúsculas, use el método .istitle() para verificar y el método .title() para obtener una copia de la cadena en mayúsculas y minúsculas.

Espero que hayas disfrutado este tutorial sobre las cadenas de Python. Como siguiente paso, aprenda a usar la comprensión de listas en Python o aprenda sobre el operador no igual en Python.

¡Feliz aprendizaje y codificación!🎉