Cadenas o strings

En Python las cadenas son definidas como listas de caracteres, por lo que es posible aplicarles rebanado y las demás operaciones que vimos en la sección anterior.

Una cadena se puede formar usando comillas dobles o sencillas, de la siguiente manera:


In [ ]:
fruta = "banano"

In [ ]:
dulce = 'bocadillo'

En este caso, los operadores + y * dan los siguientes resultados:

Operación Uso Resultado
+ cadena + cadena Une dos cadenas
* cadena * número Repite una cadena tantas veces como sea el número

Con las dos variables arriba definidas podemos realizar, por ejemplo, las siguientes operaciones:


In [ ]:
fruta + dulce

In [ ]:
fruta * 3

In [ ]:
dulce[0]

In [ ]:
dulce[:7]

In [ ]:
dulce[::-1]

Sin embargo, las cadenas no pueden ser modificadas, es decir, no les puede asignar nuevos elementos como a las listas y por tanto son inmutables. Esto lo podemos constatar a continuación:


In [ ]:
fruta[2] = 'z'

Las cadenas tienen varios métodos que pueden ser de gran utilidad. A ellos se puede acceder colocando un punto después del nombre de la variable a la que se le haya asignado una cadena y oprimiendo la tecla Tab. Por ejemplo, si después de fruta colocamos un punto, veremos que aparece:


In [ ]:
fruta.

Nota: Ninguno de estos métodos modifican a la cadena original, pues como ya dijimos, las cadenas son inmutables.

Entre estos métodos, vamos a mirar que comportamiento tienen los siguientes:

  • upper: Convierte toda la cadena en mayúsculas

In [ ]:
fruta.upper()
  • count: Cuenta cuantas veces se repite un carácter en una cadena

In [ ]:
fruta.count('a')
  • replace: Reemplaza un carácter o parte de una cadena por otro carácter o cadena

In [ ]:
fruta.replace('a', 'o')

In [ ]:
fruta.replace('ban', 'en')
  • split: Divide una cadena según los espacios que tenga y genera una lista de palabras.

In [ ]:
s = "Hola, mundo! Hola mundo"

In [ ]:
s.split()

También puede dividir una cadena por un determinado carácter para partirla en varias subcadenas:


In [ ]:
dulce.split('d')

Problemas

Problema 1

Tomar la variable dulce, hacer que se repita 50 veces, y separar las palabras con un espacio, de tal forma que obtengamos algo como lo siguiente, pero sin generar un espacio al final.

    'bocadillo bocadillo ...'

In [ ]:
# Escribir la solución aquí

Problema 2

¿Cuántas veces se repite la palabra banano en la siguiente cadena?:


In [ ]:
muchas_frutas = 'banAnobanAnobananobanaNobananobananobanaNobaNanobanano\
bananobananobaNanobananobananobaNanobAnanobananobananobanaNobananobanAno\
bananobananobanaNobananobananobananobananobananobananobananobananobAnAno\
bAnanobananobananobananobananobananobanANobananobananobanaNobananobanano\
bananobanaNobAnAnobananobananobananobananobananobAnAnobananobananobanano\
baNanobananobananobaNaNobananobANanobananobananobananobAnanobananobanano\
bananobananobAnanobananobaNAnobananobananobananobaNanobanaNobANanobanano\
baNanobananobananobAnanobananobananobananobaNAnobananobanANobananobAnano\
bANanobanAnobananobaNanobananobananobananobananobananobananobAnanobanano\
bananobanAnobananobananobanAnobananobananobananobanAnobananobananobaNano\
bAnanobananobAnanobaNanobananobanaNobananobananobanANobananobananobANAno\
bananobananobaNAnobanaNobAnanobanAnobananobananobanAnobaNanobananobanaNo\
banaNobANAnobananobananobanAnobananobananobanANobananobanAnobananobanano\
banaNobananobAnanobananobAnanobananobanANobananobananobanAnobanaNobanano\
bananobAnanobananobaNanobananobanANobananobananobananobaNAnobananobanAno\
bananobananobananobaNanobananobananobanAnobananobananobANanobananobanano\
bananobananobaNanobananobananobananobAnanobananobananobananobananobanano\
bananobanANobananobanaNobAnanobananobaNanobaNAnobananobananobananobanano\
bananobananobananobananobananobAnanobanaNobananobananobaNAnobananobanANo\
bananobanaNobananobananobananobananobananobaNanobananobanaNobanAnobanAno\
bananobanAno'

Respuesta:

150

In [ ]:
# Escribir la solución aquí

Problema 3

Cuántas veces se repite banano en la cadena anterior, sin importar si algunas de sus letras están en mayúsculas o no?

Respuesta:

239

In [ ]:
# Escribir la solución aquí

Problema 4

¿Qué produce el método center?

Experimentar con los siguientes comandos para ver que produce:


In [ ]:
dulce.center(2)

In [ ]:
dulce.center(10)

In [ ]:
dulce.center(16)

In [ ]:
dulce.center(30)

Tuplas

Una tupla es un arreglo inmutable de distintos tipos de datos. Es decir, es como si fuera una lista y tiene sus mismas propiedades, pero al igual que las cadenas, no es posible modificar ninguno de sus valores.

Las tuplas se definen con paréntesis ( ) en lugar de corchetes. Un ejemplo de tupla sería:


In [ ]:
tp = (1, 2, 3, 4, 'a')

In [ ]:
tp[3]

In [ ]:
tp[-1]

In [ ]:
tp[2:]

Pero no podemos modificar sus valores mediante nuevas asignaciones:


In [ ]:
tp[2] = 'b'

Nota: Es posible omitir los paréntesis al momento de definir una tupla si así se desea, lo cual es una práctica bastante extendida entre los programadores de Python. Por ejemplo, una asignación válida es:


In [ ]:
tp1 = 'a', 'b', 2

In [ ]:
tp1

Problemas

Problema 1

¿Es posible calcular el promedio a la lista de la siguiente tupla?


In [ ]:
li = (3, 18, 17, 44, 14, 12, 29, 19, 4, 6, 17, 7, 14, 6, 8, 17, 17, 21, 65,\
      19, 10, 31, 92, 17, 5, 15, 3, 14, 20, 12, 29, 57, 15, 2, 17, 1, 6, 17, 2,\
      71, 12, 11, 62, 14, 9, 20, 43, 19, 4, 15)

In [ ]:
# Escribir la solución aquí

Problema 2

Crear una tupla que tenga un sólo elemento


In [ ]:
# Escribir la solución aquí

Problema 3

¿Qué efecto tiene esta operación


In [ ]:
x, y, z = tp1

dado el valor de tp1 definido arriba?


In [ ]:
# Obtener los valores de x, y, z aquí

Teniendo en cuenta esto, explicar qué ocurre al realizar esta operación entre los elementos de una lista


In [ ]:
l = [-1, 6, 7, 9]
l[0], l[2] = l[2], l[0]

In [ ]:
# Imprimir la lista l aquí

Problema 4

¿Por qué, en cambio, esta operación falla?


In [ ]:
u, v = tp1

Problema 5

¿Cómo se calcula el máximo de una tupla?


In [ ]:
# Escribir la solución aquí

Diccionarios

Los diccionarios son una estructura de datos muy usada en Python. Ya hemos visto que los elementos de listas, cadenas y tuplas están indexados por números, es decir, li[0], fruta[1] o tp[2]. En su lugar, los diccionarios están indexados por claves (o keys en inglés), que pueden ser no sólo números, sino también cadenas, tuplas o cualquier otro tipo de datos que sea inmutable.

Lo interesante de los diccionarios es que nos sirven para relacionar dos tipos distintos de datos: las claves con sus valores (o values en inglés), que pueden ser mutables o inmutables.

Por ejemplo, supongamos que queremos guardar los códigos que varias personas están utilizando para entrar a un servicio web. Esto lo podemos hacer muy fácilmente con un diccionario, en el que las claves sean el nombre de cada persona y sus valores sean las contraseñas que estén usando.

Para ello, en Python podemos escribir algo como:


In [ ]:
codigos = {'Luis': 2257, 'Juan': 9739, 'Carlos': 5591}

Como podemos ver, los diccionarios se definen con llaves ({ }). Las claves son los elementos que están a la izquierda de los :, mientras que los que están a la derecha son los valores.

Como ya se mencionó, para extraer un elemento de un diccionario es necesario usar alguna de sus claves. En nuestro caso, las claves son los nombres de las personas. Por ejemplo, para extraer el código que le corresponde a Carlos debemos escribir:


In [ ]:
codigos['Carlos']

o para el de Juan


In [ ]:
codigos['Juan']

Si alguien cambia de contraseña, podemos actualizar nuestro diccionario fácilmente haciendo una nueva asignación, por ejemplo:


In [ ]:
codigos['Luis'] = 1627

In [ ]:
codigos

Nota: Los diccionarios no tienen un orden interno por defecto. En el último ejemplo podemos ver como 'Luis' aparece al final del diccionario, mientras que en la primera definición de códigos aparecía al principio. No hay que preocuparse por ello.

O si una persona se retira del servicio, podemos eliminarla del diccionario usando el siguiente comando:


In [ ]:
codigos.pop('Juan')

In [ ]:
codigos

Si queremos introducir el nombre y la contraseña de una nueva persona, sólo es necesario usar una nueva clave y asignarle un valor, así


In [ ]:
codigos['Jorge'] = 6621

In [ ]:
codigos

Para saber si una persona ya está en el diccionario o no, usamos el siguiente método:


In [ ]:
'Carlos' in codigos.keys()

In [ ]:
'José' in codigos.keys()

Finalmente, para extraer todas las claves y los valores de un diccionario podemos usar los siguientes métodos:


In [ ]:
codigos.keys()

In [ ]:
codigos.values()

Problemas

Problema 1

Dado el siguiente diccionario que guarda las notas de distintos estudiantes


In [ ]:
notas = {
    'Juan': [4.5, 3.7, 3.4, 5],
    'Alicia': [3.5, 3.1, 4.2, 3.9],
    'Germán': [2.6, 3.0, 3.9, 4.1]
}

calcular:

  • La nota promedio de Juan (recuerde que se puede utilizar sum y len para obtener el promedio).

Respuesta

4.15

In [ ]:
# Escribir la solución aquí
  • La nota promedio del curso

Respuesta

3.74

In [ ]:
# Escribir la solución aquí

Conversión entre cadenas, tuplas, listas y diccionarios

Para convertir entre unos y otros tipos de datos, en Python se usan los siguientes comandos:

  • str: Convierte números y cualquier otro objeto a una cadena.

In [ ]:
str(36.1)

In [ ]:
str([1,2,3])
  • list: Convierte tuplas, diccionarios y cadenas a una lista.

In [ ]:
list((3, 2, 4))

In [ ]:
list('1457')

Para los diccionarios, list sólo extrae las claves y no los valores


In [ ]:
list({'a': 12, 'b': 5})
  • dict: Convierte una lista de listas, donde cada una tiene dos elementos, a un diccionario.

In [ ]:
dict([[10, 'a'], [15, 't']])

El material de este notebook fue recopilado para Clubes de Ciencia Colombia 2017 por Luis Henry Quiroga (GitHub: lhquirogan) - Germán Chaparro (GitHub: saint-germain), y fue adaptado de https://github.com/PythonBootcampUniandes