Bienvenidos sean a este post, hoy veremos a la contraparte del post anterior.
Las secuencias mutables a diferencia de sus hermanas vistas en el post anterior si podemos cambiar el valor de estas una vez creadas, estas estan compuestas principalmente por dos tipos: listas y arrays de bytes, si bien estos son dos tipos de colecciones o estructura de datos, el verdadero rey de todos ellos es dictionary (diccionario) el cual mencionamos en este post pero si este es el rey su reina sera lista.
Listas
Estas son muy similares a los tuples vistos en el post anterior pero en este caso no tendremos las restricciones de la inmutabilidad, usualmente se lo usa para almacenar colecciones de objetos homogeneos pero en realidad nada te impide tener objetos heterogeneos pero este es un tema que veremos en un momento, pasemos a ver las distintas formas de crear una lista vacia:
>>> []
[]
>>> list()
[]
>>>
En este caso vemos dos formas de crear una lista vacia, ya sea con corchetes o con la funcion list, veamos como crear una lista con valores:
>>> [1, 2, 3]
Es tan simple como crear tuples pero en lugar de usar parentesis utiliza los corchetes y los valores tambien estan separados por comas, ahora vamos a hacer algo asombroso:
>>> [x + 5 for x in [2,3,4]]
[7, 8, 9]
>>>
Primero especificamos que al valor almacenado en x le sumamos 5, despues tenemos un bucle for donde x tendra los valores de 2, 3 y 4, si observan el resultado es la operacion que introdujimos antes del bucle, es realmente magico, vamos a ver una lista de un tuple:
>>> list((1,3,5,7,9))
[1, 3, 5, 7, 9]
>>>
Esta es una forma simple de convertir un tuple en una lista, por ultimo vamos a transformar una cadena en una lista:
>>> list('tinchicus')
['t', 'i', 'n', 'c', 'h', 'i', 'c', 'u', 's']
>>>
Esto es como trabajar con array de chars de otros lenguajes mas primitivos, hasta aqui vimos como crear nuestras listas, asi como convertir otros tipos de datos en listas, pasemos a ver algunas herramientas de este tipo de secuencias, primero vamos a crear una nueva lista:
>>> a = [1, 2, 1, 3]
Nuestro siguiente paso sera agregar un nuevo valor por medio de la funcion append:
>>> a.append(13)
>>> a
[1, 2, 1, 3, 13]
>>>
Una vez hecho si lo mostramos en pantalla veremos que al final tenemos el nuevo valor porque tal como su nombre lo indica agrega (append) nuevos elementos a la lista, otra forma de agregar es por medio de extend:
>>> a.extend([5, 7])
>>> a
[1, 2, 1, 3, 13, 5, 7]
>>>
Como pueden ver la ventaja de trabajar con extend es la posibilidad de agregar mas de un valor a nuestra lista, por ultimo vamos a utilizar insert:
>>> a.insert(0, 17)
>>> a
[17, 1, 2, 1, 3, 13, 5, 7]
>>>
Con la funcion insert tenemos la posibilidad de insertar o ingresar un valor en la posicion que queramos, en este caso lo hacemos en la primera posicion, la cero, cuando lo mostramos en pantalla vemos como ahora nos quedo al comienzo de la misma, a esto nos referimos con secuencias mutables, pasemos a ver algunas funciones para obtener ciertos datos de nuestra lista:
>>> a.count(1)
2
>>> a.index(13)
5
>>>
La primera funcion nos sirve para contar cuantas veces se repite el valor que informamos en los parentesis y la segunda nos dice en que posicion de la lista o indice de la lista se encuentra el valor que le pasamos, comparen con el valor mostrado del ejemplo anterior y veran que ambos datos que devuelven son correctos, vamos a ver un par de funciones que nos permiten mas operaciones:
>>> min(a)
1
>>> max(a)
17
>>> sum(a)
49
>>> len(a)
8
>>>
En este caso tenemos una serie de funciones para obtener algunas datos extras, la primera funcion nos devuelve el valor minimo de la lista, la segunda nos devuelve el valor maximo de la lista, la tercera nos devuelve la suma total de los valores y la ultima nos devuelve la cantidad de elementos en dicha lista, con todo esto podemos pasar a ver como remover datos de la lista:
>>> a.pop()
7
>>> a.pop(3)
1
>>> a
[17, 1, 2, 3, 13, 5]
>>>
En este caso primero vemos a la funcion pop, si no informamos ninguna posicion este ira a la ultima posicion, lo removera pero antes nos mostrara en pantalla cual valor fue removido, despues hacemos lo mismo pero le pedimos que remueva la posicion 3 o lo mismo que decir la cuarta posicion, hace lo mismo primero removiendo el valor pero mostrandolo en pantalla, por ultimo les muestro como quedo hasta ahora nuestra lista, veamos la ultima funcion para remover un elemento:
>>> a.remove(17)
>>> a
[1, 2, 3, 13, 5]
>>>
Por medio de remove le decimos que quite el valor 17 de la lista, luego la mostramos y vemos que efectivamente se removio de la lista, veamos dos funciones para modificar el orden de nuestras listas:
>>> a.reverse()
>>> a
[5, 13, 3, 2, 1]
>>> a.sort()
>>> a
[1, 2, 3, 5, 13]
>>>
El primer metodo invierte el orden de los valores almacenados en la lista, comparen con el ejemplo anterior, y el segundo se encarga de ordenar los valores de menor a mayor, por ultimo vamos a ver una funcion para limpiar a nuestra lista:
>>> a.clear()
>>> a
[]
>>>
Como pueden ver esta es la forma mas simple de poder eliminar todos los elementos de una lista, con esto tenemos lo basico para manejar nuestras listas, a continuacion veremos un par de particularidades mas, la primera va a ser un par de operaciones arimeticas en listas:
>>> a = [1, 3, 5, 7]
>>> b = [6, 7, 8]
>>> a + b
[1, 3, 5, 7, 6, 7, 8]
>>> a * 2
[1, 3, 5, 7, 1, 3, 5, 7]
>>>
En este caso crearemos dos listas, a y b, lo primero que haremos es usar la suma de las dos listas pero a diferencia de lo que uno puede creer en lugar de sumar los valores hara una concatenacion de las dos listas quedando una superlista con todos los valores, en el segundo caso tomamos la lista a y la multiplicamos por 2, observando que ahora tenemos los valores de la lista a duplicados, recuerdan cuando al principio dijimos que la coleccion de objetos de una lista podia ser heterogenea, veamos un ejemplo practico:
>>> s = list('tinchicus')
>>> s
['t', 'i', 'n', 'c', 'h', 'i', 'c', 'u', 's']
>>> s.append(100)
>>> s
['t', 'i', 'n', 'c', 'h', 'i', 'c', 'u', 's', 100]
>>> s.extend('...')
>>> s
['t', 'i', 'n', 'c', 'h', 'i', 'c', 'u', 's', 100, '.', '.', '.']
>>> s.insert(4,100)
>>> s
['t', 'i', 'n', 'c', 100, 'h', 'i', 'c', 'u', 's', 100, '.', '.', '.']
>>>
En este ejemplo podemos ver como utilizamos todas las funciones para agregar nuevos valores, ya sean al final de nuestra lista o entre medio pero en todos los casos nunca afecto el acceso a la misma a pesar de ser distintos tipos, esta es una gran caracteristica del lenguaje, por ultimo vamos a hablar sobre la funcion sorted la cual sera una de las utiles para trabajar con listas, veamos el siguiente ejemplo:
>>> from operator import itemgetter
>>> a = [(5,3), (1,3), (1,2), (2, -1), (4,9)]
>>> sorted(a)
[(1, 2), (1, 3), (2, -1), (4, 9), (5, 3)]
>>>
Primero importaremos una funcion del paquete operator pero usaremos en el proximo ejemplo, luego creamos una lista con varios valores que poseen dos valores distintos, por ultimo usamos a sorted para ordenar los valores internos, ahora veremos como manejarlo con la funcion que importamos anteriormente:
>>> sorted(a, key=itemgetter(0))
[(1, 3), (1, 2), (2, -1), (4, 9), (5, 3)]
>>> sorted(a, key=itemgetter(1))
[(2, -1), (1, 2), (5, 3), (1, 3), (4, 9)]
>>> sorted(a, key=itemgetter(1), reverse=True)
[(4, 9), (5, 3), (1, 3), (1, 2), (2, -1)]
>>>
El primer caso solo los ordenara por el primer valor de los informados, por esta razon puede variar con respecto al ejemplo anterior, el siguiente caso lo ordena unicamente por el segundo valor y el ultimo caso lo vuelve a ordenar por el segundo valor pero esta vez en sentido inverso gracias al switch reverse, con esto hemos visto todas las opciones para manejar nuestras listas pasemos al siguiente tema.
Arrays de Bytes
Los arrays de bytes o mejor conocidos como bytearray son la version mutable de los objetos de tipo bytes, poseen los metodos mas usuales para manejar tanto a estos objetos como los objetos de tipo bytes, para entender mejor el tema veamos un ejemplo:
>>> bytearray()
bytearray(b'')
>>>
Esta funcion solamente crear un bytearray vacia, para crear un array con algunos datos usaremos la siguiente funcion:
>>> bytearray(10)
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>>
En este caso como solo informamos un numero el array creo 10 posiciones con valor de cero dentro del mismo, veamos el siguiente ejemplo:
>>> bytearray(range(5))
bytearray(b'\x00\x01\x02\x03\x04')
>>>
En este caso creamos un array de una iteracion de enteros por medio de range, si observan ahora tenemos valores dentro del mismo en 5 distintas posiciones, veamos otro ejemplo:
>>> nombre = bytearray(b'tinchicus')
>>> nombre.replace(b't', b'T')
bytearray(b'Tinchicus')
>>>
Primero creamos un nuevo array llamado nombre (observen como le pasamos la letra b para indicar que es de bytes y no un string), una vez creado usamos a replace para modificar la t minuscula por mayuscula, luego nos devuelve el cambio realizado, ahora probemos el siguiente ejemplo:
>>> nombre.endswith(b'us')
True
>>>
En este caso usamos endswith para verificar si el array termina con el valor que le pasamos, en este ‘us’, como es verdad nos devuelve un True, pasemos al siguiente ejemplo:
>>> nombre.count(b'i')
2
>>>
En esta ocasion vemos la funcion count que usaremos para contar en que posicion esta la informacion que le pasemos, para el caso es correcto que nos devuelva 2, por ultimo veamos el siguiente ejemplo:
>>> nombre.upper()
bytearray(b'TINCHICUS')
>>>
Por ultimo usamos una funcion llamada upper para convertir todos los caracteres en mayusculas, tan simple como eso, y podemos ver el resultado en pantalla, con todo esto cubrimos algunas de las funciones mas utilizadas para los arrays de bytes y con esto completamos las secuencias mutables.
En resumen, hemos visto dos de los tipos de secuencias mutables que difieren de lo visto en el post anterior, hemos visto que son las listas, las distintas funciones que nos proveen, las propiedades interesantes que nos dan mayor practicidad para trabajar, hemos visto como podemos transformar algunos tipos en otros y permitiendo la mutabilidad, tambien hemos visto a los arrays de bytes, como es, algunas funciones y cuales son las posibilidades que nos brindan, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.