3.3.2 Tipos de listas simplemente enlazadas, doblemente enlazadas y circulares
Qué es una lista
Las listas en Python son un tipo contenedor, compuesto, que se usan para almacenar conjuntos de elementos relacionados del mismo tipo o de tipos distintos.
Junto a las clases tuple, range y str, son uno de los tipos de secuencia en Python, con la particularidad de que son mutables. Esto último quiere decir que su contenido se puede modificar después de haber sido creada.
Para crear una lista en Python, simplemente hay que encerrar una secuencia de elementos separados por comas entre paréntesis cuadrados [].
Por ejemplo, para crear una lista con los números del 1 al 10 se haría del siguiente modo:
>>> numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Como te decía, las listas pueden almacenar elementos de distinto tipo. La siguiente lista también es válida:
>>> elementos = [3, 'a', 8, 7.2, 'hola']
Incluso pueden contener otros elementos compuestos, como objetos u otras listas:
>>> lista = [1, ['a', 'e', 'i', 'o', 'u'], 8.9, 'hola']
Las listas también se pueden crear usando el constructor de la clase, list(iterable). En este caso, el constructor crea una lista cuyos elementos son los mismos y están en el mismo orden que los ítems del iterable. El objeto iterable puede ser o una secuencia, un contenedor que soporte la iteración o un objeto iterador.
Por ejemplo, el tipo str también es un tipo secuencia. Si pasamos un string al constructor list() creará una lista cuyos elementos son cada uno de los caracteres de la cadena:
>>> vocales = list('aeiou')
>>> vocales
['a', 'e', 'i', 'o', 'u']
Termino esta sección mostrando dos alternativas de crear una lista vacía:
>>> lista_1 = [] # Opción 1
>>> lista_2 = list() # Opción 2
Cómo acceder a los elementos de una lista en Python
Para acceder a un elemento de una lista se utilizan los índices. Un índice es un número entero que indica la posición de un elemento en una lista. El primer elemento de una lista siempre comienza en el índice 0.
Por ejemplo, en una lista con 4 elementos, los índices de cada uno de los ítems serían 0, 1, 2 y 3.
>>> lista = ['a', 'b', 'd', 'i', 'j']
>>> lista[0] # Primer elemento de la lista. Índice 0
'a'
>>> lista[3] # Cuarto elemento de la lista. Índice 3
'i'
Si se intenta acceder a un índice que está fuera del rango de la lista, el intérprete lanzará la excepción IndexError. De igual modo, si se utiliza un índice que no es un número entero, se lanzará la excepción TypeError:
>>> lista = [1, 2, 3] # Los índices válidos son 0, 1 y 2
>>> lista[8]
Traceback (most recent call last):
File "
", line 1, in
IndexError: list index out of range
>>> lista[1.0]
Traceback (most recent call last):
File "", line 1, in
TypeError: list indices must be integers or slices, not float
Como hemos visto, las listas pueden contener otros elementos de tipo secuencia de forma anidada. Por ejemplo, una lista que uno de sus ítems es otra lista. Del mismo modo, se puede acceder a los elementos de estos tipos usando índices compuestos o anidados:
>>> lista = ['a', ['d', 'b'], 'z']
>>> lista[1][1] # lista[1] hace referencia a la lista anidada
'b'
Acceso a los elementos usando un índice negativo
En Python está permitido usar índices negativos para acceder a los elementos de una secuencia. En este caso, el índice -1 hace referencia al último elemento de la secuencia, el -2 al penúltimo y así, sucesivamente:
>>> vocales = ['a', 'e', 'i', 'o', 'u']
>>> vocales[-1]
'u'
>>> vocales[-4]
'e'
Acceso a un subconjunto de elementos
También es posible acceder a un subconjunto de elementos de una lista utilizando rangos en los índices. Esto es usando el operador [:]:
>>> vocales = ['a', 'e', 'i', 'o', 'u']
>>> vocales[2:3] # Elementos desde el índice 2 hasta el índice 3-1
['i']
>>> vocales[2:4] # Elementos desde el 2 hasta el índice 4-1
['i', 'o']
>>> vocales[:] # Todos los elementos
['a', 'e', 'i', 'o', 'u']
>>> vocales[1:] # Elementos desde el índice 1
['e', 'i', 'o', 'u']
>>> vocales[:3] # Elementos hasta el índice 3-1
['a', 'e', 'i']
También es posible acceder a los elementos de una lista indicando un paso con el operador [::]:
>>> letras = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
>>> letras[::2] # Acceso a los elementos de 2 en 2
['a', 'c', 'e', 'g', 'i', 'k']
>>> letras[1:5:2] # Elementos del índice 1 al 4 de 2 en 2
['b', 'd']
>>> letras[1:6:3] # Elementos del índice 1 al 5 de 3 en 3
['b', 'e']
for list Python – Recorrer una lista
Ya hemos visto que se puede usar el bucle for en Python para recorrer los elementos de una secuencia. En nuestro caso, para recorrer una lista en Python utilizaríamos la siguiente estructura:
>>> colores = ['azul', 'blanco', 'negro']
>>> for color in colores:
print(color)
azul
blanco
negro
Añadir elementos a una lista en Python
Tal y como te he adelantado, las listas son secuencias mutables, es decir, sus elementos pueden ser modificados (se pueden añadir nuevos ítems, actualizar o eliminar).
Para añadir un nuevo elemento a una lista se utiliza el método append() y para añadir varios elementos, el método extend():
>>> vocales = ['a']
>>> vocales.append('e') # Añade un elemento
>>> vocales
['a', 'e']
>>> vocales.extend(['i', 'o', 'u']) # Añade un grupo de elementos
>>> vocales
['a', 'e', 'i', 'o', 'u']
También es posible utilizar el operador de concatenación + para unir dos listas en una sola. El resultado es una nueva lista con los elementos de ambas:
>>> lista_1 = [1, 2, 3]
>>> lista_2 = [4, 5, 6]
>>> nueva_lista = lista_1 + lista_2
>>> nueva_lista
[1, 2, 3, 4, 5, 6]
Por otro lado, el operador * repite el contenido de una lista n veces:
>>> numeros = [1, 2, 3]
>>> numeros *= 3
>>> numeros
[1, 2, 3, 1, 2, 3, 1, 2, 3]
Y para terminar esta sección, indicarte que también es posible añadir un elemento en una posición concreta de una lista con el método insert(índice, elemento). Los elementos cuyo índice sea mayor a índice se desplazan una posición a la derecha:
>>> vocales = ['a', 'e', 'u']
>>> vocales.insert(2, 'i')
>>> vocales
['a', 'e', 'i', 'u']
Modificar elementos de una lista
Es posible modificar un elemento de una lista en Python con el operador de asignación =. Para ello, lo único que necesitas conocer es el índice del elemento que quieres modificar o el rango de índices:
>>> vocales = ['o', 'o', 'o', 'o', 'u']
# Actualiza el elemento del índice 0
>>> vocales[0] = 'a'
>>> vocales
['a', 'o', 'o', 'o', 'u']
# Actualiza los elementos entre las posiciones 1 y 2
>>> vocales[1:3] = ['e', 'i']
>>> vocales
['a', 'e', 'i', 'o', 'u']
Eliminar un elemento de una lista en Python
En Python se puede eliminar un elemento de una lista de varias formas.
Con la sentencia del se puede eliminar un elemento a partir de su índice:
# Elimina el elemento del índice 1
>>> vocales = ['a', 'e', 'i', 'o', 'u']
>>> del vocales[1]
>>> vocales
['a', 'i', 'o', 'u']
# Elimina los elementos con índices 2 y 3
>>> vocales = ['a', 'e', 'i', 'o', 'u']
>>> del vocales[2:4]
>>> vocales
['a', 'e', 'u']
# Elimina todos los elementos
>>> del vocales[:]
>>> vocales
[]
Además de la sentencia del, podemos usar los métodos remove() y pop([i]). remove() elimina la primera ocurrencia que se encuentre del elemento en una lista. Por su parte, pop([i]) obtiene el elemento cuyo índice sea igual a i y lo elimina de la lista. Si no se especifica ningún índice, recupera y elimina el último elemento.
>>> letras = ['a', 'b', 'k', 'a', 'v']
# Elimina la primera ocurrencia del carácter a
>>> letras.remove('a')
>>> letras
['b', 'k', 'a', 'v']
# Obtiene y elimina el último elemento
>>> letras.pop()
'v'
>>> letras
['b', 'k', 'a']
Finalmente, es posible eliminar todos los elementos de una lista a través del método clear():
>>> letras = ['a', 'b', 'c']
>>> letras.clear()
>>> letras
[]
El código anterior sería equivalente a del letras[:].
Longitud (len) de una lista en Python
Como cualquier tipo secuencia, para conocer la longitud de una lista en Python se hace uso de la función len(). Esta función devuelve el número de elementos de una lista:
>>> vocales = ['a', 'e', 'i', 'o', 'u']
>>> len(vocales)
5
Cómo saber si un elemento está en una lista en Python
Ya adelanté en el tutorial sobre operadores en Python, que para saber si un elemento está contenido en una lista, se utiliza el operador de pertenencia in:
>>> vocales = ['a', 'e', 'i', 'o', 'u']
>>> if 'a' in vocales:
... print('Sí')
...
Sí
>>> if 'b' not in vocales:
... print('No')
...
No
sort list Python – Ordenar una lista en Python
Las listas son secuencias ordenadas. Esto quiere decir que sus elementos siempre se devuelven en el mismo orden en que fueron añadidos.
No obstante, es posible ordenar los elementos de una lista con el método sort(). El método sort() ordena los elementos de la lista utilizando únicamente el operador < y modifica la lista actual (no se obtiene una nueva lista):
# Lista desordenada de números enteros
>>> numeros = [3, 2, 6, 1, 7, 4]
# Identidad del objeto numeros
>>> id(numeros)
4475439216
# Se llama al método sort() para ordenar los elementos de la lista
>>> numeros.sort()
>>> numeros
[1, 2, 3, 4, 6, 7]
# Se comprueba que la identidad del objeto numeros es la misma
>>> id(numeros)
4475439216
Listado de métodos de la clase list
Termino este tutorial mostrando la lista completa de métodos de la clase list. Algunos de ellos ya se han mencionado en las secciones anteriores.
Otras listas enlazadas
Las listas presentadas hasta aquí son las listas simplemente enlazadas, que son sencillas y útiles cuando se quiere poder insertar o eliminar nodos de una lista en tiempo constante. Existen otros tipos de listas enlazadas, cada uno con sus ventajas y desventajas.
Listas doblemente enlazadas
Las listas doblemente enlazadas son aquellas en que los nodos cuentan no sólo con una referencia al siguiente, sino también con una referencia al anterior. Esto permite que la lista pueda ser recorrida en ambas direcciones.
En una lista doblemente enlazada, es posible, por ejemplo, eliminar un nodo, teniendo únicamente ese nodo, sin necesidad de saber también cuál es el anterior.
Entre las desventajas podemos mencionar que al tener que mantener dos referencias el código se vuelve más complejo, y también que ocupa más espacio en memoria.
Listas circulares
Las listas circulares, que ya fueron mencionadas al comienzo de esta unidad, son aquellas en las que el último nodo contiene una referencia al primero. Pueden ser tanto simplemente como doblemente enlazadas.
Se las utiliza para modelar situaciones en las cuales los elementos no tienen un primero o un último, sino que forman una cadena infinita, que se recorre una y otra vez.
Nota
Un ejemplo de uso de las listas circulares es dentro del kernel Linux. La mayoría de las listas utilizadas por este kernel son circulares, ya que la mayoría de los datos a los que se quiere acceder son datos que no tienen un orden en particular.
Por ejemplo, la lista de tareas que se están ejecutando es una lista circular. El scheduler del kernel permite que cada tarea utilice el procesador durante una porción de tiempo y luego pasa a la siguiente; y al llegar a la última vuelve a la primera, ya que la ejecución de tareas no se termina.
Ejercicio Listas Tuplas
A) Solicitar al usuario que ingrese números, los cuales se guardarán en una lista. Finalizar al ingresar el número 0, el cual no debe guardarse.
B) A continuación, solicitar al usuario que ingrese un número y, si el número está en la lista, eliminar su primera ocurrencia. Mostrar un mensaje si no es posible eliminar.
C) Recorrer la lista para imprimir la sumatoria de todos los elementos.
D) Solicitar al usuario otro número y crear una lista con los elementos de la lista original que sean menores que el número dado. Imprimir esta nueva lista, iterando por ella.
E) Generar e imprimir una nueva lista que contenga como elementos a tuplas de dos elementos, cada una compuesta por un número de la lista original y la cantidad de veces que aparece en ella. Por ejemplo, si la lista original es [5,16,2,5,57,5,2] la nueva lista contendrá: [(5,3), (16,1), (2,2), (57,1)]
Nombrar al archivo Programa.py
© 2019 Dance School. All Rights Reserved | Design by
W3layouts