6. Strings: Cadenas de caracteres

Contenidos

  1. Introducción a strings
  2. Slices o trozos de un string
  3. Uso del for con strings
  4. ¿Cómo se ordenan las letras?
  5. Funciones y métodos pre-definidos de la clase string
  6. Ejercicios

6.1 Introducción a strings

Hasta el momento, hemos visto cómo realizar programas que usan números para hacer operaciones matemáticas. Pero, ¿qué pasa si queremos hacer un programa que, por ejemplo, nos salude? Algo así:

>>> Ingresa tu nombre: Valeria
>>> ¡Bienvenida, Valeria!

Hemos trabajado hasta ahora haciendo operaciones con números, pero los programas también pueden necesitar procesar texto. En Python, el tipo de variable para guardar texto se llama string (str).

Por ejemplo, Twitter permite escribir mensajes de hasta 140 caracteres. Podemos escribir un pequeño programa que nos indique si un texto tiene más de 140 caracteres.

s = input(“Ingresa tu tweet”)
if len(s)>140:
  print(“Este tweet es demasiado largo!”)

En el código anterior, la instrucción input ya no lleva int(…) ni float(…), pues efectivamente entrega un string (por lo que no es necesario convertirlo a otro tipo de variable). Es decir, la variable s guarda un objeto de tipo str, con el texto que el usuario haya ingresado (desde que comenzó a escribir hasta que presionó <Enter>). Luego, ocupamos la función len, predefinida en Python, que nos entrega el largo del string entregado como parámetro. Es decir, por ejemplo:

  • len(“hola”) entregará 4
  • len(“uno dos y tres”) entregará 14 (sí, los espacios y cualquier otro carácter que uses, cuentan)

Ejemplo 6.1

Haz un programa que pida un texto a un usuario e imprima: “El texto era: <Texto>” en donde <Texto> es el texto ingresado por el usuario.

6.2 Slices o trozos de un string

En los mensajes de Twitter, los usuarios pueden incluir hashtags, o palabras que comienzan con el símbolo #, por ejemplo #ComunidadUC en el Tweet de la figura 6.1:

Figura 6.1
Figura 6.1. Tweet #ComunidadUC.

Queremos hacer un programa que cuente cuántos hashtags hay en un Tweet. Para lograr eso, tendríamos que recorrer todo el texto, encontrando cada carácter “#” para contarlo. Lo que necesitamos es, entonces, obtener el i-ésimo carácter de un string s. Eso se consigue utilizando el operador s[i]. Los caracteres del string se ennumeran comenzando en 0, es decir, el primer carácter del string está en la posición 0, el segundo en la posición 1, y así sucesivamente. Por ejemplo, si s = “abracadabra”,

  • s[0] será “a”
  • s[1] será “b”
  • s[2] será “r”
  • s[3] será “a”
  • s[4] será “c”

… y así sucesivamente.

¿En que posición está el último carácter de un string de largo N? Dado que los caracteres se enumeran desde 0, el último carácter estará en la posición N-1. Por ejemplo, si s=”hola”, len(s) es 4, y:

  • s[0] es “h”
  • s[1] es “o”
  • s[2] es “l”
  • s[3] es “a” (Nota que si N = 4, N-1 es 3)
  • s[4] lanzaría un error, dado que no hay carácter en la posición 4.

Volvamos, entonces, al ejemplo anterior: queríamos contar cuantos caracteres de tipo hashtag (#) hay en un string. Entonces, para recorrer un string s desde su primer carácter hasta el último, podemos escribir el siguiente código:

Ejemplo 6.2

Haz un programa que reciba un string y lo imprima caracter por caracter.

Ejemplo 6.3

En este ejemplo haremos la función char_at que recibe un string y un número. Se debe retornar el caracter en la posición indicada por el número si esta es válida. **IMPORTANTE: **Las posiciones de los caracteres en un string van del 0 hasta el <número de caracteres> - 1.

No solo podemos obtener un solo carácter del string, podemos también obtener un trozo. Para esto, usaremos el mismo operador anterior, pero indicando desde dónde y hasta dónde queremos obtener. Entonces, para obtener un trozo, o slice, de un string s, decimos s[desde:hasta]. Es importante notar que el valor de hasta no estará incluido en la respuesta (por ejemplo, s[2:4] entregará los caracteres desde la posición 2 (incluida) hasta la posición 4 (no incluida), es decir, los caracteres de las posiciones 2 y 3 solamente. Si s = "hola",

  • s[2:4] entregará “la”
  • s[0:2] entregará “ho”
  • s[0:4] entregará “hola”

Ejemplo 6.4

Haz una función que reciba un string y dos índices. Se debe retornar el string que va entre las posiciones indicadas por los índices. Si las posiciones no son validas se debe avisar.

6.3 Uso del for con strings

Ya vimos cómo recorrer un string desde su comienzo (posición 0) hasta el final (posición largo-1) usando while. Esto es algo que haremos tan frecuentemente, que hay una manera más cómoda de hacer este mismo recorrido, recorriendo carácter por carácter. Para esto, utilizamos la instrucción for (que en castellano sería algo como “para”). Con for, automáticamente se recorre el string carácter por carácter. Por ejemplo:

s = input(“Ingresa tu tweet”)
for l in s:
  print(l)

6.4 Cómo se ordenan las listas

Puedes comparar los caracteres en Python con los mismos operadores de comparación de números (por ejemplo, < y >). Por ejemplo, si comparas números, 2 < 3 entregará True, y 50 > 51 entregará False. De la misma manera, "a" < "b" entrega True y "c" > "z" entrega False, pues se usa el mismo orden del abecedario que usan los diccionarios (ver: Orden Lexicográfico). Sin embargo, ¿qué pasa si comparas “a” con “A”? Quizás nos gustaría que fueran iguales, pero no es así: el orden que tienen en realidad está dado por una tabla (ver: Tabla ASCII) en la que cada letra equivale a un número.

Ejemplo 6.5

En este ejemplo haremos una función que para cada caracter en un string, imprima su valor en la tabla ascii.

6.5 Funciones y métodos pre-definidos de la clase string

Los strings en Python son objetos. Aunque veremos exactamente qué significa esto más adelante, por ahora veremos que esto tiene consecuencias muy útiles: hay un largo listado de métodos, o funciones, que se les pueden aplicar a los strings y que nos permiten manipularlos muy fácilmente. Acá, te contaremos sobre algunos, el resto los puedes encontrar en la documentación de Python o escribiendo, en la consola de Python, help(str).

s.upper(), s.lower()

Podemos empezar por solucionar el problema anterior: ¿cómo podríamos hacer, por ejemplo, un diccionario en Python si es que no podemos hacer que “avión” y “AVIÓN” sean la misma palabra, o si Python ordenaría “BARCO” como menor (es decir, antes en el diccionario) que “velero”? La solución es usar métodos que permiten convertir mayúsculas a minúsculas o viceversa. Estos métodos se llaman upper() y lower(), y se aplican al string, pero no lo modifican, solo entregan una versión del string modificado. Veamos un ejemplo:

Nota que s.upper() entrega el string s, todo en mayúsculas (“BIENVENIDOS AL SHOW DE MAGIA!!!”), y que no hay problema con caracteres que no son letras, simplemente no serán modificados. Lo mismo con s.lower(), que entrega “bienvenidos al show de magia!!!”. Finalmente, nota que upper() y lower() NO modificaron al string s, que se imprime al final igual que como estaba en el string original.

s.find()

Siguiendo con el ejemplo de Twitter, podríamos querer encontrar un carácter dentro de otro – no nos interesa, por ejemplo, saber cuántos hashtags hay, sino solo si hay o no. Para esto, podemos usar find, que encuentra un string dentro de otro, entregando la posición donde comienza el string encontrado. Por ejemplo,

Si el tweet no tuviera un hashtag, find devolvería el valor -1. En cambio, si hay un hashtag dentro del tweet, find devolverá la posición del primer hashtag (un valor, entonces, entre 0 y N-1, si N es el largo del string).

Ahora, ¿qué pasa si queremos, por ejemplo, revisar si después de un hashtag viene el nombre de algún usuario (indicado en Twitter con un “@”)? Necesitamos revisar si hay un carácter “@”, pero sólo sirve si está después del hashtag “#ComunidadUC”. Para eso, podemos entregar 1 o 2 parámetros adicionales a la función find: desde donde buscar, y hasta donde buscar (Se puede especificar solamente desde, o desde y hasta). Por ejemplo, s.find(“@”,3,8) busca el primer carácter “@” desde la posición 3 (incluida) hasta la posición 8 (no incluida). Entonces, para el problema anterior, podríamos hacer lo siguiente:

s.count()

Como vimos antes, podemos contar cuántas veces aparece un carácter (o un string) dentro de otro. Antes, contamos los hashtags (#) de un Tweet. También existe un método llamado count que permite hacer esto.

Esto también sirve para contar cuántas veces aparece un string dentro de otro, por ejemplo, si quisiera saber cuántas veces se está usando en particular el hashtag #ComunidadUC, podemos hacerlo:

La función count también permite especificar un rango desde y hasta, al igual que find.

s.replace()

Podríamos querer reemplazar un string por otro. Por ejemplo, ¿qué pasa si queremos cambiar #ComunidadUC por #AvisoUC?

La función replace también permite especificar un rango desde y hasta. A continuación, veamos otro ejemplo:

Ejemplo 6.6

En este ejemplo haremos uso de funciones propias de los strings. Haga una función que reciba un string y un caracter. Se deben contar todas las apariciones de ese caracter en el string. Luego se deben quitar del string todas las apariciones del caracter.

6.6 Ejercicios

A continuación, te proponemos varios ejercicios para que los resuelvas en tu libro interactivo.

Ejercicio 6.1

En la siguiente actividad se revisará automáticamente el resultado de tu programa. Debes crear una función llamada contar_mayusculas y otra llamada contar_minusculas. Ambas reciben un string y deben retornar el numero de caracteres en mayúsculas y minúsculas que tenía el string respectivamente.

Ejercicio 6.2

Haz una funcion llamada palindromo que reciba un string y retorne True si es un palíndromo y False en caso contrario. Un string es palíndromo si se lee de la misma forma en sus dos sentidos.

Ejercicio 6.3

Haz una funcion count_string, que reciba como parámetro un string y un caracter y retorne un int que represente el número de apariciones del caracter en el string. Si no se ingreso un caracter (por ejemplo, un string de largo 1), se debe retornar -1. No debes usar la función count de Python.

Ejercicio 6.4

Haz una función extraer_string, que reciba un parámetro s y otro n, que separe quite el caracter n-ésimo en s y retorne el string a partir de la posición n+1 en adelante. No se debe usar la notación [:] de Python.

Ejercicio 6.5

Haz una función reemplazar que reciba dos parámetros, s, original y reemplazo, que reemplace las apariciones del string original en s por reemplazo. No se puede utilizar la función reeplace de Python.

Next Section - 7. Listas: Secuencias de elementos