<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Estructuras de datos
Python posee además de los tipos de datos básicos, otros tipos de datos más complejos. Se trata de las tuplas, las listas y los diccionarios.
Estos tres tipos, pueden almacenar colecciones de datos de diversos tipos y se diferencian por su sintaxis y por la forma en la cual los datos pueden ser manipulados.
<br />
SECUENCIAS
Step1:  <br />
ACCESO A LOS ELEMENTOS DE UNA SECUENCIA
Los elementos de las secuencias pueden ser accedidos mediante el uso de corchetes [ ], como en otros lenguajes de programación.
Podemos indexar las secuencias utilizando la sintaxis [&lt;inicio&gt;
Step2:  Los elementos de las secuencias, tanto listas como tuplas, son hetereogéneos, así que es posible definir listas que contienen valores númericos y cadenas de caracteres, así como otras listas
Step3:  En el caso de las listas, podemos modificar los datos almacenados
Step4:  Se pueden concatenar listas o tuplas mediante el operador +
Step5:  <BR />
DESEMPAQUETAR TUPLAS
En muchos casos es interesante asignar nombre a los elementos de las tuplas para, posteriormente, trabajar con esas variables.
Step6:  Mostramos otro ejemplo con tuplas anidadas
Step7:  <BR />
LISTAS
Step8:  <br />
AÑADIR Y ELEMINAR ELEMENTOS DE UNA LISTA
Aunque se pueden añadir elementos como hemos visto antes, la forma más eficiente es mediante el método append, que añade elementos al final de la lista. Otra forma de añadir elementos es mediante el método insert, que inserta un elemento en una determinada posición.
Step9:  La operación pop permite eliminar el elemento de la lista que ocupa una determinada posición.
Step10:  Pero puede darse el caso de que necesitemos eliminar un elemento de la lista y que no conozcamos la posición que ocupa. En esos casos utilizaremos el método remove.
Step11:  <BR />
ORDENAR LISTAS
El método sort permite ordenar una lista sin necesidad de crear una lista nueva, por lo que la operación es muy eficiente.
Step12:  <BR />
GENERAR LISTAS
Python 2.7 proporciona la función predefinida range(inicio, fin, paso) para generar listas automáticamente. En Python 3.5 no se genera una lista; se genera un objeto iterable.
Step13:  <BR />
SECUENCIAS DE CARACTERES STR
Las cadenas son consideradas como una secuencia de caracteres y por tanto pueden ser tratadas como otras secuencias (tuplas o listas). Podemos acceder a cada uno de los caracteres de una cadena
<ASSISTANT_TASK:>
Python Code:
# Ejemplo de lista, los valores van entre corchetes
una_lista = [4, "Hola", 6.0, 99 ]
# Ejemplo de tupla, los valores van entre paréntesis
una_tupla = (4, "Hola", 6.0, 99)
print ("Lista: " , una_lista)
print ("Tupla: " , una_tupla)
# Las tuplas y las listas aceptan operadores de comparación y devuelven un booleano
print (una_lista == una_tupla)
# una_lista = [4, "Hola", 6.0, 99 ]
# una_tupla = (4, "Hola", 6.0, 99)
# Uso del operador IN
4 in una_lista, 5 not in una_tupla
# Uso de la función LEN, que nos dice cuantos elementos componen una lista o una tupla
len(una_lista), len(una_tupla)
# Uso de la funcion SORTED para ordenar los elementos de una lista/tupla
# Al ordenar la lista no la modifica, se crea una nueva; de ahí que tengamos que definir una variable para ejecutar la función
lista = [ 5, 6, 7, 1, 4, 2, 9 ]
otra = sorted(lista)
otra
Explanation: Estructuras de datos
Python posee además de los tipos de datos básicos, otros tipos de datos más complejos. Se trata de las tuplas, las listas y los diccionarios.
Estos tres tipos, pueden almacenar colecciones de datos de diversos tipos y se diferencian por su sintaxis y por la forma en la cual los datos pueden ser manipulados.
<br />
SECUENCIAS: TUPLAS Y LISTAS
Tanto las tuplas como las listas son conjuntos ordenados de elementos.
Una tupla es una variable que permite almacenar datos inmutables (no pueden ser modificados una vez creados) de tipos diferentes. Las tuplas se encierran entre paréntesis.
Tienen longitud fija
Solo tiene una dimensión (*)
Una lista es similar a una tupla con la diferencia fundamental de que permite modificar los datos una vez creados. Las listas se encierran entre corchetes y además pueden ser de mútiples dimensiones
<br />
End of explanation
lista = [5, 3, 1, 6, 99]
print(lista)
# Mostrar el primer elemento
print(lista[0])
# Mostrar el tercer elemento
print(lista[2])
# Uso de la sintaxis [<inicio>:<final>:<salto>]
lista = [2, 9, 6, 4, 3, 71, 1, 32, 534, 325, 2, 6, 9, 0]
print(lista)
# Muestra 3 elementos, comenzando por el elemento situado en la posición 3 y
# terminando en el de la posición 6, con saltos de 1 elementos
# [3,6) es como se expresa en notación científica, donde el corchete incluye y el paréntesis excluye
print(lista[3:6:1])
# Muestra todos los elementos, desde el primero hasta el último, con saltos de 2 elementos
print(lista[::2])
# Se puede acceder a los elementos de una secuencia de manera inversa
print ( lista[-1] )  # El último elemento
print ( lista[-2] )  # El penúltimo elemento
Explanation: <br />
ACCESO A LOS ELEMENTOS DE UNA SECUENCIA
Los elementos de las secuencias pueden ser accedidos mediante el uso de corchetes [ ], como en otros lenguajes de programación.
Podemos indexar las secuencias utilizando la sintaxis [&lt;inicio&gt;:&lt;final&gt;:&lt;salto&gt;].
En Python, la indexación empieza por CERO
End of explanation
# Lista con valores heterogéneos
lista = ["A", 26, "lista", 9, -62]
lista2 = [1, 2, 3, 4]
lista3 = ["A", "B", "C", "D"]
# Lista que incluye otra lista, así como otros valores
lista4 = [lista2, [6, 98, "Abc"]]
print(lista4)
# Acceder a los elementos de una lista que a su vez está incluida en otra lista (una matriz o array)
# [acceso a la lista][acceso a la posición de dicha lista]
d = lista4[1][2]
print(d)
# Lista simple o de 1 dimensión
matriz1 = [
            1, 2, 3,
            4, 5, 6,
            7, 8, 9,
]
# Acceso al elemento 3 de la lista
print("Valor A: ", matriz1[3])
# Lista de 3 dimensiones
matriz2 = [
            [1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]
]
# Acceso al elemento 1 de la segunda lista
print("Valor B: ", matriz2[2][0])
Explanation: Los elementos de las secuencias, tanto listas como tuplas, son hetereogéneos, así que es posible definir listas que contienen valores númericos y cadenas de caracteres, así como otras listas:
End of explanation
lista = [1, 2, 3, 4]
print ( "Antes: ", lista)
lista[0] = 0.0
print ("Después: ", lista)
print(matriz2)
matriz2[1] = [0,0,0]
matriz2
# Con esta instrucción "matriz2.*?" nos muestra todas las posibilidades existentes: 
# matriz2.append
# matriz2.clear
# matriz2.copy
# matriz2.count
# matriz2.extend
# matriz2.index
# matriz2.insert
# matriz2.pop
# matriz2.remove
# matriz2.reverse
# matriz2.sort
# Por ejemplo para añadir una lista a otra lista mediante la instrucción append.
# Se puede añadir sólo un valor, no es necesario añadir una lista entera
matriz = [[1,2,3],[4,5,6],[7,8,9]]
matriz.append(['A','B','C'])
print(matriz)
matriz.append(5)
matriz
# Para quitar un elemento de la lista, se usa la instrucción remove
matriz.remove(5)
matriz
Explanation: En el caso de las listas, podemos modificar los datos almacenados:
End of explanation
# Ejemplo de concatenación de dos tuplas
# En el primer ejemplo se crea una tupla con dos tuplas concatenadas, definiendolas en la misma línea
tupla = (1,2,3) + ('a','b','c')
print(tupla)
# Creación de una tupla a partir de dos tuplas definidas previamente
tupla1 = (6,9,7,'abc')
tupla2 = (1,6,0,'def')
tupla_f = tupla1 + tupla2
tupla_f
# Se pueden utilizar operadores matemáticos con las listas o tuplas
# A destacar que el uso de los operadores + y * no modifican las secuencias originales, sino que crean nuevas secuencias
tupla_m = tupla1 * 4
tupla_m
Explanation: Se pueden concatenar listas o tuplas mediante el operador +
End of explanation
# Se define una tupla llamada "laborales"
laborales = (1, 2, 3, 4, 5 )
# Se define una variable llamada "laborales" con una serie de valores para dicha tupla
# La definición de la variable puede hacerse antes de los valores o despues de los valores
lunes, martes, miercoles, jueves, viernes = laborales
# Si preguntamos por un valor de dicha variable nos devolverá su correspondencia dentro de la tupla
martes
Explanation: <BR />
DESEMPAQUETAR TUPLAS
En muchos casos es interesante asignar nombre a los elementos de las tuplas para, posteriormente, trabajar con esas variables.
End of explanation
# Creamos una tupla llamada "dias" anidando dos tuplas, una ya existente ("laborales") y otra que creamos al anidar (6,7)
dias = laborales, (6, 7)
# El resultado es una tupla de tuplas
dias
# Crea la variable "dias" a partir de la variable "laborales", añadiendo dos valores nuevos (sabado, domingo)
laborales, (sabado, domingo) = dias
sabado
Explanation: Mostramos otro ejemplo con tuplas anidadas:
End of explanation
# Definimos una tupla
tupla = (3, 4, 5)
# Mediante la función "list" creamos una lista a partir de la tupla anterior
lista = list(tupla)
lista
# Se puede modificar una lista especificando la posición a modificar y un valor
lista[0] = None     # valor nulo en Python
lista
lista[0] = 3
lista
Explanation: <BR />
LISTAS: CASOS PARTICULARES
Como hemos dicho anteriormente, las listas pueden tener longitud variable y son mutables. También hemos visto que pueden definirse mediante [ ].
Otra forma de definir las listas es mediante la función list.
End of explanation
# Definimos una lista
lista = ['Lunes', 'Jueves']
print(lista)
# Mediante la instrucción "append(valor)" añadimos a dicha lista un valor
# Con append(valor) añadimos siempre el elemento al final de la lista
lista.append('Viernes')
print(lista)
# La instrucción "insert(posición,valor)" es similar a append(valor), con la salvedad de que nos permite añadir el elemento
# en la posición que nostros queramos
lista.insert(1, 'Martes')
print(lista)
lista.insert(2, 'Miércoles')
print(lista)
Explanation: <br />
AÑADIR Y ELEMINAR ELEMENTOS DE UNA LISTA
Aunque se pueden añadir elementos como hemos visto antes, la forma más eficiente es mediante el método append, que añade elementos al final de la lista. Otra forma de añadir elementos es mediante el método insert, que inserta un elemento en una determinada posición.
End of explanation
# Para usar la instrucción "pop(posición)" hay que definir una variable que realice dicha operación
# En este ejemplo borramos la posición 3 "Jueves"
borrar = lista.pop(3)
borrar
# Verificamos que la lista ya no contiene el elemento "Jueves"
lista
Explanation: La operación pop permite eliminar el elemento de la lista que ocupa una determinada posición.
End of explanation
lista.remove('Viernes')
lista
Explanation: Pero puede darse el caso de que necesitemos eliminar un elemento de la lista y que no conozcamos la posición que ocupa. En esos casos utilizaremos el método remove.
End of explanation
# Definimos una lista
lista = [5,7,2,0,4,7,1,5,4,3,4,1,9,0]
# Mediante el método "sort()" ordenamos la lista
lista.sort()
# Con "remove()" eliminamos un elemento especificando entre paréntesis el primer valor a eliminar, en caso de que haya dos
# o más elementos igules en la lista. La diferencia con "pop(posición)" es que si la lista no está ordenada eliminamos el primer
# elemento que coincida, con pop() podemos eliminar un elemento concreto.
print(lista)
lista.remove(0)
lista
Explanation: <BR />
ORDENAR LISTAS
El método sort permite ordenar una lista sin necesidad de crear una lista nueva, por lo que la operación es muy eficiente.
End of explanation
# Se define la variable 'l' como un rango que empieza en 0, termina en 11 y va en saltos de 2
l = range(0,11,2)
# Después mediante la función list() creamos una lista de 'l'
list(l)
# Ejemplo desglosado, en este caso si no se especifica un paso, lo realiza de 1 en 1
# Variable y muestra del valor de dicha variable
l = range(-5, 5)
l
# Uso de list() para crear la lista de la variable 'l'
list(l)
Explanation: <BR />
GENERAR LISTAS
Python 2.7 proporciona la función predefinida range(inicio, fin, paso) para generar listas automáticamente. En Python 3.5 no se genera una lista; se genera un objeto iterable.
End of explanation
# Definimos una variable con un valor string
a = "Ana"
# Se considera que la cadena o string "Ana" es una secuencia de 3 posiciones, siendo:
# A --> posición 0
# n --> posición 1
# a --> posición 2
# Por tanto se puede acceder a cada uno de los caracteres que componen un string como si fueran elementos de una lista o tupla
a, a[0], a[2]
# Los espacios no se tienen en cuenta
mensaje = "Vaya calor que hace"
mensaje[0], mensaje[12]
# Las cadenas en Python son inmutables. Eso quiere decir que no es posible modificar una cadena sin crear otra nueva.
b = mensaje.replace('V', 'v')
b, mensaje
# Uso de len() para saber la longitud de la string como si fuera una lista o tupla
len(mensaje)
Explanation: <BR />
SECUENCIAS DE CARACTERES STR
Las cadenas son consideradas como una secuencia de caracteres y por tanto pueden ser tratadas como otras secuencias (tuplas o listas). Podemos acceder a cada uno de los caracteres de una cadena:
End of explanation
<END_TASK>