Tema 6. Estructura de Datos. Listas

Explicación del uso de estructuras de datos tipo listas en Python 3.

Lista

La primera estructura de datos que veremos son las listas. Éstas son un conjunto de elementos ordenados separados por comas y escritos entre claudators, [].

Las listas son:

  • hetereogéneas: los elementos pueden ser de distinto tipo en una misma lista

  • mutables: los elementos pueden ser modificados

Un ejemplo de lista sería

l = ["Juan", 31, 172.32, True]
print(l)

#RESPUESTA
['Juan', 31, 172.32, True]
type(l)

#RESPUESTA
list

Tamaño de una lista

Para saber la longitud o el tamaño de una lista, podemos hacer uso de la función len()

Elementos de una lista

Cada elemento en la lista tiene su propio índice

A María le corresponde el índice 0; a Juan, el 1; a Claudia el 2; a Jorge, el 3; y a Avelina, el 4.

¡Cuidado! En Python, los índices siempre empiezan en 0. De este modo, al primer elemento le corresponde el índice 0; al segundo, el índice 1; y al $n$-ésimo, le corresponde el índice $n−1$.

Dada una lista, podemos acceder a sus elementos utilizando la sintaxis [].

¡Cuidado! Si dada una lista llamamos a un elemento cuyo índice no existe para dicha lista, Python automáticamente nos devolverá error.

Podemos acceder a los últimos elementos de la lista haciendo uso de índices negativos.

Si en vez de querer acceder a los elementos uno por uno estamos interesados en acceder a avarios elementos a la vez, podemos hacer uso de la función :

Observación. En cuanto a la función :

  • El índice indicado a la derecha de los : nunca es incluido

  • Si no indicamos elemento a la izquierda de los :, por defecto Python interpreta que se trata del 0

  • Si no indicamos elemento a la derecha, por defecto Pythoninterpreta que debe mostrar los elemetos desde el índice indicado a la izquierda hasta el último.

Además de acceder, podemos modificar los elementos de una lista

Podemos añadir nuevos elementos a una lista con el método .append()

Observación. Los elementos añadidos con el método .append(), se incluyen al final.

Si quisiéramos añadir un nuevo elemento a una lista, pero no lo quisiéramos al final, sino en una posición específica, entonces utilizaremos el método .insert() al que primero le indicamos el índice donde queremos posicionar el nuevo elemento y, en segundo lugar, indicamos dicho nuevo elemento.

Observación. Cuando le indicamos que queremos el elemento Andrés en el índice 1, el que antes ocupaba dicho índice, Cristian, pasa a ocupar el siguiente, 2, y así con el resto de elementos que van a continuación.

EJERCICIO 1:

Vamos a pedirle al usuario la longitud de una lista y haremos que introduzca por teclado tantos números enteros como haya indicado, que se guardarán en una lista. Al acabar, imprimiremos la lista.

Bucles con listas

Si quisiéramos imprimir por pantalla todos los elementos de una lista, lo podríamos hacer mediante los índices

o mucho más fácilmente iterando la lista con un for con la siguiente sintaxis:

Concatenación de listas

Dadas dos o más listas, podemos concatenarlas haciendo uso de la función +

Repetición de listas

Podemos repetir una misma lista tantas veces como queramos con la función *

Lista vacía

Más métodos de listas

El método .count() recibe un elemento como argumento y cuenta la cantidad de veces que aparece en la lista

El método .extend() extiende la lista agregando al final el iterable indicado por parámetro.

Observación. Un iterable es un objeto de Python capaz de devolver sus elementos uno por uno, permitiendo ser iterado en un bucle for. De momento solo conocemos las listas y el resultado de range(), pero en secciones futuras veremos los diccionarios, las tuplas y los conjuntos, que también son objetos iterables.

El método index() recibe un elemento como argumento y devuelve el índice de la primera aparición en la lista.

El método .pop() devuelve el último elemento de la lista y lo borra de la misma.

El método .remove() recibe como argumento un elemento y borra su primera aparición de la lista.

El método .reverse() devuelve la lista en orden inverso.

El método .sort() devuelve la lista en orden.

Si quisiésemos ordenar los elementos en orden decreciente, podríamos hacer uso del parámetro reverse del método .sort():

Observación. De momento solo conocemos las listas y el resultado de range(), pero en secciones futuras veremos los diccionarios, las tuplas y los conjuntos, que también son objetos iterables.

EJERCICIO 2:

Dada una lista de caracteres, le pediremos al usuario qué elemento quiere eliminar y lo eliminaremos de la lista.

EJERCICIO 3:

Vamos a pedir al usuario que ingrese 10 números, los guardaremos en una lista y mostraremos la lista ordenada, siendo el usuario quien indique el orden: ascendente o descendente.

Conversión a listas

Para convertir un objeto iterable de Python a lista, hay que usar la función list()

EJERCICIO 4:

Vamos a convertir los números impares del 0 al 30 a una lista y mostrar los elementos con el fomato "El valor {} ocupa el índice {}"

Listas anidadas

Las listas anidadas son listas dentro de listas. Es decir, las listas no solo pueden contener números, strings o datos booleanos, sino que también pueden contener otras listas.

Ejemplo 1

A continuación mostramos una lista anidada, pues consta de 3 elementos:

  • 1 lista de 3 strings

  • 1 lista heterogénea de 3 elementos que a su vez contiene una lista con 5 números

  • 1 número

Para que se vea más claro se puede colocar cada elemento de la lista en una nueva linea para que sea más facil de visualizar.

Para acceder a un elemento, necesitamos indicar su índice. Si un elemento está en una lista dentro de una lista dentro de una lista, en primer lugar indicamos el índice de la lista exterior dentro de []; después, el índice de la siguiente lista más exterior también entre []; y por último, el índice de la lista más interna, claramente también entre [].

Accedamos al string Fernándezy luego al número 5.


Matrices

Hay un tipo muy utilizado de listas anidadas. Se caracteriza por ser una lista de $m$ listas, donde cada una de las listas tiene el mismo número de elementos, $n$. A este tipo de listas se les conoce como matrices.

En matemáticas, las matrices se definen del siguiente modo.

Matriz. Una matriz de dimensiones m x n es una tabla formada por elementos dispuestos en m filas y n columnas de la forma:

matriz

Los elementos de la matriz se representan con doble subíndice, a_{{ij}}\,\!donde el primero indica la fila a la que pertenece y, el segundo, la columna.

Para acceder a los elementos de una matriz en Python, utilizamos la sintaxis [][], donde primero indicamos la fila y, a continuación, la columna

Podemos mostrar una matriz de Python en forma de tabla con un bucle for, del siguiente modo

Si lo que queremos es mostrar todos los elementos de la matriz en columna, podemos utilizar dos bucles for anidados del siguiente modo:

Si lo que queremos es mostrar la matriz en forma de tabla, sin comas ni claudators por en medio, lo podemos hacer de dos formas:

  • Haciendo uso de las dimensiones de la matriz y, por tanto, de la función range()

  • Sin hacer uso de las dimensiones

La primera forma sería:

Observación.

  1. Como todas las filas tienen el mismo número de elementos, nos da igual si calculamos $n$ con la primera fila o con cualquier otra.

  2. Hemos hecho uso del parámetro end de la función print() para indicar si, en vez de un salto de línea como ocurre por defecto, queremos que suceda otra cosa inmediatamente después de ejecutar la función print(). En este caso, hemos indicado que queremos un espacio en blanco.

Y la segunda forma, es la siguiente:

Suma de matrices

Para poder sumar dos matrices, necesitamos que tengan la misma dimensión. Entonces, dadas A y B dos matrices con dimensión m x n , su suma será una matriz de dimensión m x n y sus elementos se obtienen del siguiente modo:

suma de matrices

Dadas dos matrices con la misma dimensión, las podemos usar haciendo uso de bucles for anidados.

Observación. Hemos puesto un if que, suponiendo que tanto A como B son matrices, comprueba si sus dimensiones coinciden. De ser cierto, procede a hacer la suma. De lo contrario, devuelve un mensaje indicando que la suma no puede llevarse a cabo.

Producto de matrices

Para poder multiplicar matrices, necesitamos que la matriz de la izquierda tenga el mismo número de columnas que número de filas tiene la matriz de la derecha. Entonces, dadas las matrices A y B de dimensiones m x n y n x p respectivamente, su producto será una matriz de dimensión m x p y se obtiene del siguiente modo:

multiplicación de matrices

Dadas dos matrices, la primera con el mismo número de columnas que filas tiene la segunda, podemos multiplicarlas del siguiente modo:

El resultado de multiplicar las matrices A y B ha sido:

EJERCICIO 5:

Vamos a crear manualmente una matriz de tamaño 4 x 4 y guardarla en una lista.

EJERCICIO 6:

Vamos a sumar dos matrices con listas. Ambas matrices serán proporcionadas por el usuario, así como la dimensión de las matrices.

EJERCICIO 7:

Vamos a calcular el producto de dos matrices con listas. Ambas matrices serán dadas por el usuario así como las dimensiones de ambas.

Matrices con numpy

Existe una forma más sencilla de trabajar con matrices y es gracias a la librería numpy. Para importarla, simplemente hay que ejecutar la siguiente línea de código.

Para crear una matriz vacía, usamos el método .empty(), al que le indicamos por parámetro las dimensiones

Para crear una matriz vacía con las mismas dimensiones de otra matriz definida anteriormente, usamos el método .empty_like(), al que le indicamos por parámetro la matriz existente

Para crear una matriz nula, usamos el método .zeros(), al que le indicamos por parámetro las dimensiones

Para crear una matriz de ceros con las mismas dimensiones de otra matriz definida anteriormente, usamos el método .zeros_like(), al que le indicamos por parámetro la matriz existente

Para crear una matriz de unos, usamos el método .ones(), al que le indicamos por parámetro las dimensiones

Para crear una matriz de unos con las mismas dimensiones de otra matriz definida anteriormente, usamos el método .ones_like(), al que le indicamos por parámetro la matriz existente

Podemos crear matrices de numpy a partir de listas con el método .matrix()

Para saber las dimensiones de una matriz, podemos utilizar el método .shape

Ahora es más sencillo sumar matrices, pues solamente necesitamos la función +

También es más sencillo hacer el producto matricial $A\cdot B$ con el método .dot()

Gracias a numpy, también es mucho más sencillo mostrar una matriz en forma de tabla, pues nos basta con hacer uso de la función print():

En futuras secciones hablaremos más detenidamente de todo lo que es capaz la librería numpy.

EJERCICIO 8:

Vamos a introducir manualmente una matriz con numpy donde las dimensiones son proporcionadas por el usuario.

EJERCICIO 9:

Vamos a sumar dos matrices con numpy. Ambas matrices las proporcionará el usuario, así como sus dimensiones.

EJERCICIO 10:

Vamos a multiplicar dos matrices con numpy. Ambas matrices serán proporcionadas por el usuario, así como la dimensión de ambas.

REPASO

Last updated