7. Listas: Secuencias de elementos

Contenidos

  1. Definición del tipo list
  2. Indexación y slicing
  3. Mutabilidad de listas
  4. Recorrido de listas con for
  5. Operaciones sobre listas
  6. Pertenencia a listas
  7. Listas de listas
  8. Funciones y métodos sobre listas
  9. Ejemplos
  10. Ejercicios

7.1 Definición del tipo list

Una lista es una colección ordenada de valores. Al decir ordenada nos referimos a que cada elemento tiene una posición definida dentro de esta lista. Llamaremos elementos a los valores que pueden ser almacenados dentro de una lista. Los valores que pueden ser incluidos dentro de una lista son valores de cualquier tipo.

En Python definimos una lista utilizando los símbolos demarcadores [ y ], y separamos sus elementos usando ,. Por ejemplo, al escribir numeros=[10, 20, 30, 40], estamos diciendo que numeros es una lista de 4 elementos, en que cada uno de ellos es un número entero. Si escribimos:

paises=["Chile", "Perú"", "Bolivia"]

estamos diciendo que paises es una lista de 3 strings.

También podemos crear listas con distintos tipos de elementos. Por ejemplo, si escribimos:

bolsa = ["Chile", 500, 4, [640, 480]]

estamos diciendo que bolsa es una lista con 4 elementos, donde el primero es un string, el segundo y tercero son enteros, y el cuatro es una otra lista compuesta por 2 enteros.

Es posible definir listas vacías escribiendo:

listavacia = []

7.2 Indexación y slicing

Al ser una colección ordenada, cada valor tiene una posición determinada. Esto permite que sea posible acceder a un elemento específico de la lista usando su posición. El operador de índice [] (no confundir con la lista vacía), permite especificar una opción en una lista y acceder a ese elemento. De esta manera, si tenemos definida la lista

numeros=[50, 30, 90, 15, 90]

podemos acceder al elemento en la primera posición escribiendo numeros[0], que contiene el valor :code`50`. De la misma manera podemos obtener el ultimo valor de la lista escribiendo numeros[4]. Para una lista que contiene n elementos, es posible usar los índices desde 0 hasta n-1. Cualquier intento de acceder a un índice fuera de este rango generará un error.

Tal como los strings, es posible extraer parte de los elementos de una lista utilizando las operaciones de slicing. Por ejemplo, utilizando la misma lista numeros, podemos definir:

numeros[1:3]       # entrega la lista [30,90]
numeros[:3]        # entrega la lista [50,30,90]
numeros[3:]        # entrega la lista [15,90]
numeros[:]         # entrega la lista [50,30,90,15,90]
numeros[1:5:2]     # entrega la lista [30,15]
numeros[::-1]      # entrega la lista [90,15,90,30,50]

7.3 Mutabilidad de listas

A diferencia de los strings, cada elemento de una lista puede ser modificado. Por esto se dice que las listas son mutables. Supongamos que tenemos la siguiente lista:

frutas = ["pera", "manzana", "kiwi", "sandia", "naranja"]

Podemos modificar el segundo y último elemento escribiendo:

frutas[1] = "uva"
frutas[4] = "melon"
print(frutas)

y esto genera la salida:

["pera", "uva", "kiwi", "sandia", "melon"]

7.4 Recorrido de listas con for

Al ser un conjunto ordenado, es posible recorrer una lista utilizando iteraciones con for. Si tenemos la lista:

frutas = ["pera", "manzana", "kiwi", "sandia", "naranja"]

Podemos recorrerla de manera ordenada con el siguiente código:

for elemento in frutas:
  print(elemento)

el cual utiliza el operador in para asignarle a elemento un elemento distinto de la lista en cada iteración. Con esto obtenemos la salida:

pera
manzana
kiwi
sandia
naranja

7.5 Operaciones sobre listas

Una operación básica para obtener información sobre una lista es la función len() que permite obtener la longitud de una lista.

frutas = ["pera", "manzana", "kiwi", "sandia", "naranja"]
print(len(frutas))

Entrega la salida

5

Tal como los strings Las listas también permiten efectuar operaciones sencillas usando los operadores + y :code`*`.

El operador + puede ser aplicado a dos listas y entrega como resultado una tercera lista formada por la concatenación de la primera y la segunda lista, en ese orden. Esta operación no es conmutativa.

frutas = ["pera", "manzana", "kiwi", "sandia", "naranja"]
verduras = ["lechuga", "espinaca", "acelga"]
frutasyverduras = frutas + verduras
print(frutasyverduras)
print(verduras + frutas)

genera la salida

["pera", "manzana", "kiwi", "sandia", "naranja", "lechuga", "espinaca", "acelga"]
["lechuga", "espinaca", "acelga", "pera", "manzana", "kiwi", "sandia", "naranja"]

El operador * se utiliza con una lista y un entero n, y genera una lista concatenada consigo misma n veces. De esta manera, el código:

print(verduras * 3)

genera la salida

["lechuga", "espinaca", "acelga", "lechuga", "espinaca", "acelga", "lechuga", "espinaca", "acelga"]

7.6 Pertenencia a listas

La listas permiten determinar rápidamente si un elemento pertenece a ellas. El operador in se utiliza entre un elemento cualquier y una lista para determinar si el elemento se encuentra en ella. El resultado de esta operación es un bool.

De esta manera, el código:

frutas = ["pera", "manzana", "kiwi", "sandia", "naranja"]
print("tomate" in frutas)
print("melon" not in frutas)

entrega la salida:

False
True

7.7 Listas de listas

Dado que es posible almacenar cualquier tipo de elemento dentro de una lista, también se posible almacenar otras listas. Al utilizar lista dentro de listas, es posible utilizar los operadores de indexación y slicing para acceder a estos elementos.

Por ejemplo, utilizando la lista:

mezcla = ["Enero", 20, [3, 5, "1983" , [2, 367] ] ]

permite acceder a elementos o porciones de la lista de la siguiente manera:

print(mezcla[2])
print(mezcla[1:3])
print(mezcla[2][1])
print(mezcla[2][2][1])
print(mezcla[2][3][0])

genera la salida

[3, 5, '1983', [2, 367]]
[20, [3, 5, '1983', [2, 367]]]
5
9
2

La anidación de listas suele ser usada para representar matrices o tableros. Por ejemplo, el código

A = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

representa una matriz de 3x4.

El código:

G = [["X", " ", "O"], ["X", "O", " "], ["X", "O", " "]]

puede representar el estado de una partida del juego gato. ¿Pueden determinar quien ha ganado?. Un código como el siguiente:

print(G[0])
print(G[1])
print(G[2])

puede ayudar a verlo de manera más clara.

7.8 Funciones y métodos sobre listas

Algunas funciones se encuentra predefinidas para operar sobre listas. Ya vimos la función len(l) que se aplica a una lista y retorna la cantidad de elementos en ella. Otras funciones para listas son:

  • sum(l): retorna la suma de los elementos de l si todos son de tipo numérico.
  • max(l): retorna el valor más grande almacenado en l.
  • min(l): retorna el valor más pequeño almacenado en l.

Para el siguiente código,

l = [3, 4, 2, 4, 9, 6]
print(len(l))
print(max(l))
print(min(l))
print(sum(l))

la salida es:

6
9
2
28

El tipo de datos list permite el uso de métodos sobre listas utilizando .. Algunos de los métodos más más comunes son:

  • l.append(e) agrega el elemento e al final de la lista l.
  • l.extend(m) agrega todos los elementos de la lista m al final de la lista l.
  • l.count(x) retorna la cantidad de veces que el elemento x se encuentra dentro de l.
  • l.index(x) retorna el índice de la primera vez que el elemento x se encuentra dentro de l. Si no se encuentra, genera un error.
  • l.insert(i,x) inserta el elemento x en la posición i de la lista l. Si no i es mayor o igual al largo de la lista, entonces el elemento se agrega al final de l.
  • l.remove(x) elimina la primera ocurrencia de x dentro de la lista l. Si x no se encuentra, genera un error.
  • l.pop(i) elimina el elemento que se encuentra en la posición i de la lista l.
  • l.reverse() invierta la lista l. Si no se entrega la posición i, y se ejecuta solamente l.pop(), entonces se elimina el último elemento de l.
  • l.sort() ordena los elementos de l.

Por ejemplo, el siguiente código:

l1 = [1,2,3]
l2 = [5,6]
l3 = [3,2,4,4,9,6]
l4 = ["Han", "Leia", "Luke", "Chewbacca"]
print(l3.count(4))
l1.append(4)
print(l1)
l1.extend(l2)
print(l1)
l2.append(l1)
l3.index(4)
l3.insert(1,4)
print(l3)
l4.remove("Leia")
print(l4)
l4.reverse()
print(l4)
print(l3)
l3.sort()
print(l3)

entrega la salida:

2
[1, 2, 3, 4]
[1, 2, 3, 4, 5, 6]
[3, 4, 2, 4, 4, 9, 6]
[1, 2, 4, 5, 6]
[5, 6]
["Han", "Luke", "Chewbacca"]
["Chewbacca", "Luke", "Han"]
[3, 4, 2, 4, 4, 9, 6]
[2, 3, 4, 4, 4, 6, 9]

7.9 Ejemplos

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

Ejemplo 7.1

El siguiente ejemplo utiliza append dentro de un ciclo para agregar enteros a una lista. Haz un programa que pida números positivos al usuario hasta ingresar algún número negativo. Añada todos esos números a una lista. Luego imprima valor por valor los elementos agregados a esa lista.

Ejemplo 7.2

El siguiente ejemplo muestra 3 manera distintas de contar la cantidad de veces que un string se encuentra en una lista, ilustrando el recorrido usado in, usando range, y finalmente el método count. Prueba con una lista y verificando que las tres funciones generan el mismo resultado. Haz una función que reciba una lista que solamente contiene strings y un strings. Cuente el número de apariciones de el string en la lista.

Ejemplo 7.3

El siguiente ejemplo utiliza la anidación de listas para almacenar una matriz. Ya que Python no posee una representación nativa de matrices, utilizamos una función para imprimir una fila por línea y recorrer los elementos. La segunda función permite acceder directamente a un elemento particular de la matriz. En este ejemplo, haremos una función que reciba una lista de listas, e imprima sus elementos. Además haremos una segunda función que reciba una matriz, un entero i y un entero j, y retorne el elemento de la fila y y la columna j.

Ejemplo 7.4

El siguiente ejemplo ilustra un uso de lista como vectores de enteros. La función producto_punto implementa el producto punto entre dos listas de enteros que deben ser del mismo largo y contener únicamente enteros. Haz una función llamada producto_punto, que reciba dos listas del mismo largo con números (que representan vectores) y calcule el producto punto.

Ejemplo 7.5

El siguiente ejemplo ilustra cómo es posible eliminar todas las ocurrencias de un elemento de la lista. Recordemos que l.remove(x) solo elimina la primera ocurrencia, por lo tanto esta solución utilice un ciclo y un contador de ocurrencia, inicializado con count para eliminar todas las ocurrencias, y pop para eliminar una posición particular. En este ejemplo eliminaremos elementos de una lista. Haga una función que reciba una lista y un elemento. Se deben contar e imprimir todas las apariciones de ese elemento en la lista. Finalmente, se deben quitar de la lista todas las apariciones del elemento.

7.10 Ejercicios

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

Ejercicio 7.1

Debes crear una función llamada eliminar_elemento que recibe una lista y una variable. Se debe eliminar la primera aparición de la variable en la lista.

Ejercicio 7.2

Haz una funcion llamada interseccion, que reciba dos listas. Se debe retornar una lista que contenga todos los elementos que tenían en común.

Ejercicio 7.3

Haz una funcion sumar_listas, que reciba dos listas y retorne una nueva lista que contenga los elementos de ambas listas. No se debe usar el operador +.

Ejercicio 7.4

Haz una función llamada sumar_elementos. Esta recibe un String que contiene números enteros separados por el caracter “-“ (ver ejemplo en el código). Se debe retornar el valor de la suma de los números.

Ejercicio 7.5

Haz una función que reciba una lista de listas que representa una matriz. Retorna una lista de listas que sea la matriz transpuesta. Puedes suponer que cada sublista dentro de la lista es una fila de la matriz. Ademas suponemos que el input siempre es correcto.

Next Section - 8. Archivos: Datos en memoria secundaria