Listas

Definición y naturaleza

Las listas en Python son básicamente una estructura de datos compuestos por objetos contenedores de varios valores relacionados o no entre sí. Estos pueden ser de igual o distinta naturaleza, incluso pueden contener otras listas dentro de sus elementos, las listas en Python son el equivalente a los arrays en otros lenguajes de programación. Hay que destacar que las listas también pertenecen al grupo de los tipos de datos dinámicos o mutables, es decir que su contenido puede variar luego que han sido creadas. Como dato final hay que mencionar que también se pueden crear listas vacías en cuyo caso su estado booleano es FALSE. Por todo lo dicho antes podemos clasificar a las listas como objetos tipo secuencias mutables. Otro aspecto a tomar en cuenta de las listas es que sus elementos son posicionables, es decir, se puede acceder a la posición de cada elemento dentro de la lista, esto se consigue gracias un número llamado índice. No confundir la cantidad de elementos con su posición en la lista ya que el primer elemento de la lista tendrá índice cero (0), lo cual permite deducir que en una lista de n elementos la posición del último elemento será de n-1.

Para crear una variable tipo lista basta con asignar al identificador de la variable una secuencia de elementos separados con coma y encerrado entre corchetes []. Veamos el siguiente ejemplo:

lLista1=[1,2,3,4,5,6,7]
lLista2= ['Lunes','Martes','Miercoles']
print(f'El contenido de la variable lLista1 es: {lLista1}')
print(f'El contenido de la variable lLista2 es: {lLista2}')
lLista2=[9,10,11]
print(f'Ahora el contenido de la variable lLista2 cambió a: {lLista2}')

Resultado:

El contenido de la variable lLista1 es: [1, 2, 3, 4, 5, 6, 7]

El contenido de la variable lLista2 es: ['Lunes', 'Martes', 'Miercoles']

Ahora el contenido de la variable lLista2 cambió a: [9, 10, 11]

Como podemos comprobar con este resultado, las listas pueden cambiar su contenido a lo largo del programa, además el uso de corchetes es obligatorio y no debe confundirse con paréntesis ya que eso crearía otro tipo de colección llamados Tuplas, que veremos en otro apartado.

Versatilidad de las listas

Como se mencionó anteriormente, las listas pueden contener colecciones de datos de diferente naturaleza, incluso otras listas. Veamos el siguiente ejemplo:

lLista3=[1,2,3,4,5,6,7,['Lunes','Martes','Miercoles'\
    ,'Jueves','Viernes','Sabado','Domingo'],True,1.14,3.7,-4.8875]

print(lLista3)

Resultado:

[1, 2, 3, 4, 5, 6, 7, ['Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado',
'Domingo'], True, 1.14, 3.7, -4.8875]

Como se puede corroborar la lista lLista3 esta compuesta por una colección de datos de tipo numérico entero, booleano y numérico de punto flotante, incluso uno de sus elementos es otra lista compuesta a su vez de cadenas de caracteres. Demostrando así la variedad de tipos de datos que se pueden almacenar de forma dinámica en una lista.

Otra forma de crear listas es utilizar la función nativa de Python LIST(). El prototipo de la función LIST() es simple: list(<lista u objeto iterable>. Es importante destacar que se puede generar una lista desde un conjunto de objetos, otra lista y cualquier objeto iterable o que sea una colección de elementos. Veamos el siguiente ejemplo:

sCadena = 'Cadena'
lLista1 = list(('Enero', 'Febrero', 'Marzo'))
lLista2 = list(sCadena)
lLista3 = list((lLista1,lLista2))

print(f"Contenido de la lista 1:\n {lLista1}\n\n")
print(f"Contenido de la lista 2:\n {lLista2}\n\n")
print(f"Contenido de la lista 3:\n {lLista3}")

Este código arroja el siguiente resultado:

Contenido de la lista 1:
 ['Enero', 'Febrero', 'Marzo']


Contenido de la lista 2:
 ['C', 'a', 'd', 'e', 'n', 'a']


Contenido de la lista 3:
 [['Enero', 'Febrero', 'Marzo'], ['C', 'a', 'd', 'e', 'n', 'a']]

Como se puede observar, se han creado tres listas usando la función LIST(). La variable lLista1 se ha creado con la función LIST() enviando como argumento una colección de datos tipo cadena de caracteres. La variable lLista2 se ha creado de la misma manera pero esta vez se ha pasado como argumento una cadena de caracteres que contiene literalmente la palabra: "Cadena".

Es importante recordar en este punto que en Python las cadenas de caracteres son objetos iterables, es decir son una colección compuesta de elementos tipo cadena de 1 caracter de longitud. Por último se ha creado la variable lLista3 pasando como argumento un objeto iterable compuesto de las 2 variables tipo lista creadas previamente con el mismo método.

Por último es válido destacar que la función LIST() solo admite un argumento, con lo cual si se van a pasar los elementos individuales de la lista, éstos deben estar ya agrupados entre corchetes o si no el intérprete de Python lo va a procesar como si fueran varios argumentos, arrojando un error.

También es posible crear una lista vacía, invocando a la función LIST() sin argumentos y asignando el resultado a una variable o asignando una secuencia de datos vacía entre corchetes. Veamos el siguiente ejemplo:

lListaVacia=list()
lListaVacia2 = []
print(f'La lista lListaVacia contiene: {lListaVacia}')
print(f'La lista lListaVacia2 contiene: {lListaVacia2}')

Resultado:

La lista lListaVacia contiene: []
La lista lListaVacia2 contiene: []

Acceso a los elementos de una lista

Para acceder a los elementos que componen una lista en Python es necesario valerse de un índice. Dicho índice debe ser un entero encerrado entre corchetes e indica el valor de la posición en la lista a la que se quiere acceder. El rango de valores del índice va desde 0 hasta n-1, en donde n es el la cantidad de elementos que posee la colección de la lista.

Veamos el siguiente ejemplo:

Meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',\
    'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre']
    # Los índices de las listas siempre comienzan en 0
    # es por ello que el primer elemento
    # tiene índice 0 el segundo índice 1
    # y así sucesivamente

print(f'El cuarto mes del año es {Meses[3]}')

El código anterior muestra por pantalla el elemento almacenado en la cuarta posición de la lista Meses, (recordemos que el índice de las listas comienzan en 0). Resultando:

El cuarto mes del año es Abril

Como se dijo anteriormente el rango de valores de los índices de una lista va desde el 0 hasta n-1. Si por alguna razón se intenta acceder a un valor de una lista con un 'indice mayor o igual a n se producirá un error en tiempo de ejecución como sigue:

Meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',\
    'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre']
    # El valor maximo que admite el índice de una lista es el
    # total de elementos de la lista menos 1. Si se supera
    # este valor arroja un error en tiempo de ejecución.

print(f'El cuarto mes del año es {Meses[12]}')

El código anterior no se ejecutará y el intérprete de Python arrojara el siguiente error:

print(f'El cuarto mes del año es {Meses[12]}')
IndexError: list index out of range

Como se puede ver, el error "IndexError: list index out of range" efectivamente confirma que el valor usado para el índice esta fuera del rango en la instrucción donde se intenta acceder al elemento de la lista con índice 12. De igual manera el intérprete arrojaría un eror si se intenta acceder a un elemento de una lista usando un número como índice que no sea entero.

Veamos el siguiente ejemplo:

Meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',\
    'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre']

print(f'El octavo mes del año es {Meses[7.5]}')

El código anterior arroja el siguiente error al tratar de ejecutarse:

TypeError: list indices must be integers or slices, not float

Este error indica, como era de esperarse, que el intérprete de Python exige que los indices de las listas sean del tipo numérico entero (integers) o tipo rebanada (slices), este último se verá con mas detalle en otro apartado. De momento solo es importante saber que solo se pueden utilizar valores numéricos enteros como índices de lista. Sin embargo, también es posible usar índices enteros negativos para acceder los valores de una lista, siendo el rango de valores posibles desde -n hasta -1, siendo n el total de elementos de la lista. En este caso el índice negativo hará referencia a la posición del elemento de la colección de datos dentro de la lista pero en orden inverso, es decir el índice -1 hará referencia al ultimo elemento de la lista, 

Siguiendo el ejemplo anterior, si deseamos acceder al último elemento de la lista Meses, bastaría con usar como índice el valor -1. Veamos el siguiente ejemplo:

Meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',\
    'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre']

print(f'El último valor de la lista Meses es: {Meses[-1]}')
print(f'El penúltimo valor de la lista Meses es: {Meses[-2]}')
print(f'El antepenúltimo valor de la lista Meses es: {Meses[-3]}')

Podemos ver como el uso del índice uno con valor negativo (-1) devuelve el último elemento de la lista, con el índice -2 se obtiene el penúltimo elemento, con el -3 el antepenúltimo y así sucesivamente hasta llegar a n, o sea el total de elementos de la lista. Con lo cual se puede deducir que el elemento con índice -12 es el que almacena a la cadena "Enero". Veamos si es así, para ello ejecutemos el siguiente código:

Meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',\
    'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre']

print(Meses[-12])

El resultado de ejecutar este código es:

Enero

Tal como se esperaba.

También es posible que no se conozca el índice del elemento al que queremos acceder, para conocer el índice de un elemento  contamos con la propiedad .INDEX(<valor del elemento de la lista>) del objeto LIST. Que va a devolver el primer elemento de la lista que coincida con el valor que se le ha suministrado al método. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Sandia','Uva','Sandia','Banana']
print(f'El índice del elemento Sandia es: {lListaFrutas.index("Sandia")}')

Resultado:

El índice del elemento Sandia es: 1

Podemos comprobar que el método INDEX() ha devuelto el índice de la primera coincidencia del valor suministrado.

Recorrido secuencial de las listas

Para recorrer todos los elementos de una lista de manera secuencial, es decir empezar por el primer elemento, luego el segundo, el tercero y así sucesivamente, se hace necesario acceder a una de las instrucciones de bucles de repetición ya vistas.
 
Para el primer ejemplo de recorrido de listas de manera secuencial vamos a valernos de la instrucción FOR. Veamos el siguiente código:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas:
    print(sFruta)


El resultado de ejecutar este código es:

Manzana
Pera
Uva
Sandia
Banana

Como se pudo comprobar, una manera muy conveniente de acceder a todos los elementos de una lista de manera secuencial ascendente es con el uso del bucle FOR, debido a las características intrínsecas de dicha instrucción ya mencionados en el apartado bucles de repetición.

Es posible que se presente algún caso en la vida diaria de un programador en el que se requiera acceder solamente un rango de la lista. Por ejemplo los tres primeros elementos, o los elementos desde el índice 2 al 4. Para hacer esto dentro de un ciclo FOR, no es necesario recorrer toda la lista e ir evaluando con una variable el valor del índice o utilizar otro artilugio especial, ya que Python cuenta con un operador para indicar un rango de números utilizando el símbolo dos puntos (:).

Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas[1:3]:
    print(sFruta)


En el código anterior se crea en memoria una lista bajo el identificador lListaFrutas con la siguiente estructura:

01234
ManzanaPeraUvaSandiaBanana


Luego con la instrucción FOR y usando el rango [1:3] se obtiene el siguiente resultado al imprimir por pantalla:

Pera
Uva

Como podemos deducir por el resultado mostrado, el operador de selección de rango (:) accedió los indices desde el 1 hasta el 3, sin embargo el bucle FOR termina al alcanzar el último valor del rango y se sale del bucle sin ejecutar el código usando dicho valor, es por ello que nunca se imprime el valor contenido en la lista con el índice 3. También recordemos que los índices de las listas comienzan en 0, por lo que los valores a los que accederá el bucle FOR serán solamente los de índice 1 y 2, que como podemos ver en la tabla son los que contienen las cadenas de caracteres "Pera" y "Uva" respectivamente.

También es importante destacar que se puede establecer un valor superior al total de elementos de la lista, Python no arrojará error y solo accederá a los valores cuyos índices sean iguales o menores al total de elementos de la lista. Veamos el siguiente ejemplo usando la misma lista:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas[2:1000]:
    print(sFruta)

En este ejemplo hemos usado un rango con un tope superior mucho mayor al total de elementos de la lista, sin embargo el bucle va a terminar al alcanzar el final de la lista. Veamos el resultado de la ejecución de este código:

Uva
Sandia
Banana

Como podemos comprobar en esta oportunidad se ha impreso por pantalla los valores correspondientes a los elementos de la lista con índice 2, 3 y 4, ya que al alcanzar el límite superior de la lista el bucle FOR termina sin necesidad de recorrer hasta el índice de valor 1000 ya que no existe como vemos en la definición de la lista lListaFrutas.

Si se omite uno de los valores en la definición del rango de una lista Python automáticamente asumirá que el valor omitido es el límite del extremo que se está omitiendo, por ejemplo si se omite el primer valor del rango se asumirá que es 0 y si se omite el último valor del rango asumirá que su valor es el índice mas alto de la lista. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas[:2]:
    print(sFruta)

Resultado:

Manzana
Pera

Como podemos comprobar Python al no recibir el valor inferior del rango asumió que su valor es cero. Dicho en lenguaje humano extrajo el rango de la lista desde el principio y hasta llegar al índice 2 sin procesar este último.

Veamos otro ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas[2:]:
    print(sFruta)

Resultado:

Uva
Sandia
Banana

En este otro ejemplo Python entendió que el rango solicitado es desde el índice 2 incluso hasta el último, o lo que es lo mismo decir en lenguaje humano, del índice 2 inclusive en adelante

Otra posibilidad al usar el operador rango (:) dentro de un bucle FOR al acceder a una lista, es hacer el recorrido saltando de un índice al otro en pasos mayores a 1, que es el valor por defecto. Es decir, incrementando los valores del índice de dos en dos, de tres en tres o en el valor que se desee definido por un número entero que se coloca seguido de otros dos puntos. Por ejemplo en la expresión 1:50:4 se seleccionaría el rango del 1 al 50 saltando de 4 en 4. Sería el conjunto de números 1, 5, 9, 13 ... hasta alcanzar el límite superior del rango.

Veamos el siguiente ejemplo donde deseamos extraer los valores de la lista de frutas pero solo cuyos indices son valores impares, es decir los de indice 1 y 3

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas[1:len(lListaFrutas):2]:
    print(sFruta)

El código anterior arroja como resultado:

Pera
Sandia

Como podemos ver el ciclo FOR solamente accedió a los valores de la lista con índice 1 y 3, ya que inició en 1 y saltó de 2 en 2 hasta alcanzar el límite superior de la lista. Para asegurarnos de definir el valor máximo de la lista sin necesidad de conocer previamente el número de elementos que la contienen nos valemos de la función LEN(). El prototipo de esta función es como sigue: len(<objeto contenedor>), devolviendo el numero de items que componen el objeto contenedor. Como se puede suponer, no pasa nada si el número de pasos hace que la instrucción FOR se exceda del total de elementos de la lista, ya que, como vimos anteriormente, el ciclo termina automáticamente al alcanzar el límite superior de la lista. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas[1:len(lListaFrutas):50]:
    print(sFruta)

Este código solamente arroja el siguiente resultado:

Pera

Esto se debe a que si bien Python empieza en el ítem con índice 1, hace el salto con pasos de 50 en 50, haciendo que el siguiente valor luego del 1, supere el número de elementos que contiene la lista, con lo cual en lugar de arrojar error, simplemente hace que se alcance el tope superior de la lista y se salga del bucle FOR.

Es importante destacar que el uso de los valores de los primeros dos puntos para definir el rango se puede omitir y dejar solamente el valor del paso, sin embargo los dos puntos del rango se deben dejar para que el intérprete entienda que el valor al que se hace referencia luego del segundo símbolo de dos puntos es para hacer referencia al paso. Para aclarar lo anterior supongamos que queremos recorrer la lista de frutas que venimos trabajando previamente en todos sus elementos partiendo del primer elemento pero de 2 en 2, es decir deseamos acceder a los elementos de índice 0, 2, 4 y así sucesivamente hasta llegar al final de la lista. Para lograr esto utilizaremos el siguiente código:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
for sFruta in lListaFrutas[::2]:
    print(sFruta)

El resultado del código es:

Manzana
Uva
Banana

Como podemos comprobar al omitir los valores del rango ha recorrido la colección entera empezando en el primer elemento pero saltando de 2 en 2, usando el operador de rango omitiendo sus valores y el operador de paso con un entero que indica en cuanto va a ser el salto que va a hacer de un elemento a otro, de la siguiente manera ::<entero que indica el valor de paso>, como se vió en el ejemplo anterior.

Acceso a datos en listas anidadas

Como se menciono con anterioridad las listas pueden contener otras listas como elementos dentro de su colección de datos. Es decir listas anidadas dentro de otras listas. Para acceder a los datos de las listas anidadas dentro de otra lista, basta con usar índices compuestos o lo que es lo mismo, índices anidados.

Consideremos la siguiente tabla:


GabrielPerez221.32003
CesarGamboa491.72004
PedroRodriguez342.52001

Este conjunto de datos se conoce como matriz. En Python no existe un tipo de datos para crear y manipular matrices, sin embargo una matriz puede verse como una lista que contiene varias listas. Se puede considerar cada fila como una lista que contiene una colección de elementos compuestos por los datos de cada columna de dicha fila.

Para aclarar un poco la lógica de lo dicho anteriormente podemos desglosar la matriz en una lista de listas anidadas. Veamos como crear la matriz anterior en Python con listas anidadas:

lFila0=['Gabriel','Perez',22,1.3,2003]
lFila1=['Cesar','Gamboa',49,1.7,2004]
lFila2=['Pedro','Rodriguez',34,2.5,2001]
lMatriz=[lFila0,lFila1,lFila2]

Como se puede ver se han creado 4 listas, una por cada fila de la matriz y una lista que contiene todas las listas que a su vez contienen las filas.

Para acceder un elemento de la matriz o dicho de otra manera para acceder a un elemento de una lista anidada dentro de otra lista, basta con usar ambos índices. El primero para hacer referencia a la fila y el segundo para la columna. Siguiendo el ejemplo anterior si queremos acceder a la cadena de texto "Rodriguez" que esta en la tercera fila, segunda columna, se usarían los índices 2 y 1 respectivamente. Recordemos que el primer elemento de las listas tiene índice 0.

print(lMatriz[2][1])

El código anterior arroja como resultado:

Rodriguez

el cual es el valor que almacenado en el elemento de indice 1 (segundo elemento) de la lista llamada lFila2, que a su vez esta contenida en una lista llamada lMatriz en el elemento de indice 2 (tercer elemento) .

Si deseamos ver el contenido entero de la matriz, o mejor dicho, de las listas anidadas dentro de la lista lMatriz, podemos usar la función PRINT() de igual manera.

print(lMatriz)

arrojando el siguiente resultado:

[['Gabriel', 'Perez', 22, 1.3, 2003], ['Cesar', 'Gamboa', 49, 1.7, 2004], ['Pedro', 'Rodriguez', 34, 2.5, 2001]]

Como se puede ver se muestran por pantalla las filas como listas individuales dentro de una lista mas grande que las contiene, como fué concebido originalmente al ser creada la estructura para emular la matriz.

Adición de elementos a la colección de una lista

Como se mencionó con anterioridad, las listas son colecciones mutables y dinámicas, es decir que se pueden añadir, modificar y eliminar los elementos que la componen luego de haber sido creadas.

Para añadir un elemento a una lista basta con usar el método APPEND(<nuevo elemento>). Veamos el siguiente ejemplo donde añadimos una fruta a la lista de frutas luego de haber sido creada la lista.

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print('Contenido original de la lista:')
for sFruta in lListaFrutas:
    print(sFruta)

lListaFrutas.append('Naranja')

print('\nContenido de la lista luego de usar el método append():')
for sFruta in lListaFrutas:
    print(sFruta)

El código anterior arroja el siguiente resultado:

Contenido original de la lista:
Manzana
Pera
Uva
Sandia
Banana

Contenido de la lista luego de usar el método append():
Manzana
Pera
Uva
Sandia
Banana
Naranja

Como podemos comprobar el método APPEND() agregó un nuevo elemento al final de la lista luego de haber sido creada. Sin embargo es posible que se desee agregar varios elementos a una lista. Para ello usaremos el método EXTEND(<[lista de elementos a agregar separados por coma]>). Veamos el ejemplo práctico:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
lListaFrutas.extend(['Limón','Cereza','Naranja'])
print(lListaFrutas)

Resultado:

['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Limón', 'Cereza', 'Naranja']

Como podemos comprobar el resultado es la lista original mas la lista enviada a través del método EXTEND().

Concatenar listas

También es posible usar el operador de concatenación representado con el símbolo de adición (+) para unir listas. Supongamos que deseamos crear una lista nueva resultado de la unión de la lista de frutas que ya tenemos y una lista de enteros que indican un número arbitrario. Para ello podemos crear la lista de valores enteros con la función LIST() que ya vimos anteriormente usando como argumentos la lista de enteros deseada, almacenando el resultado en una variable que Python creará automáticamente como de tipo lista. A esta nueva lista vamos a llamarla lCantidadFrutas. Luego concatenaremos la lista lListaFrutas con la nueva lista lCantidadFrutas y el resultado lo almacenaremos en una variable llamada lListaTotalFrutas que Python automáticamente creará de tipo Lista. Adicionalmente comprobaremos que la variable lListatotalFrutas sea de tipo lista usando la función TYPE() que se vió anteriormente. El código quedaría así:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
lCantidadFrutas = list((23,33,12,54,4))
print('Contenido de la lista de frutas:')
print(lListaFrutas)
print('\nContenido de la lista de cantidades:')
print(lCantidadFrutas)
lListaTotalFrutas = lListaFrutas+lCantidadFrutas
print('\nContenido de la lista total de frutas:')
print(lListaTotalFrutas)
print(f'\nLa variable lListaTotalFrutas es del tipo: {type(lListaTotalFrutas)}')

El resultado sería:

Contenido de la lista de frutas:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Contenido de la lista de cantidades:
[23, 33, 12, 54, 4]

Contenido de la lista total de frutas:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 23, 33, 12, 54, 4]

La variable lListaTotalFrutas es del tipo: <class 'list'>

Como podemos comprobar se ha creado la variable lListaTotalFrutas de tipo Lista con el contenido resultado de la concatenación de las listas lListaFrutas y lCantidadFrutas.

Otra forma de agregar datos a una lista es usando el operador *, haciendo que el contenido de la lista se repita n cantidad de veces. Por ejemplo supongamos que tenemos la lista de frutas y deseamos agregar exactamente el mismo contenido 10 veces. No es necesario crear otra lista para agregarla ni usar el método APPEND() para agregar uno a uno los elementos que ya estaban originalmente en la lista. PAra lograr este objetivo bastaría con usar el operador * y el numero 10. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
lListaFrutas *= 10
print('Contenido de la lista de frutas multiplicada por 10:')
print(lListaFrutas)

El resultado sería:

Contenido de la lista de frutas multiplicada por 10:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana',
'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Como podemos ver la lista ha aumentado su tamaño almacenando ahora 50 elementos, los 5 elementos originales multiplicado por diez.

Pero ¿qué pasaría si deseamos insertar un elemento nuevo en una posición específica? ya que Python por defecto al usar el método APPEND() agrega el elemento al final de la lista. Para lograr esto podemos valernos del método INSERT(). El prototipo del método es INSERT(<indice>,<elemento a insertar>). Supongamos que deseamos insertar la fruta 'Limón' en la tercera posición, es decir en el lugar que ocupa actualmente la Uva, sabiendo que el índice de dicha posición es el 2. Para ello nos valdremos del siguiente código:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print('Contenido de la lista de frutas antes de la inserción del Limon:')
print(lListaFrutas)
lListaFrutas.insert(2,'Limon')
print('\nContenido de la lista de frutas luego de la inserción del Limon:')
print(lListaFrutas)

el resultado es el siguiente:

Contenido de la lista de frutas antes de la inserción del Limon:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Contenido de la lista de frutas luego de la inserción del Limon:
['Manzana', 'Pera', 'Limon', 'Uva', 'Sandia', 'Banana']

Como podemos comprobar ahora la lista de frutas incluye al elemento insertado en la posición deseada. Python ha corrido una posición hacia arriba todos los elementos cuyo índice es mayor al del elemento insertado.

Modificación de elementos de una lista

Si lo que deseamos es modificar un elemento de una lista, basta con usar el operador de asignación (=), para ello es necesario saber el índice el elemento a modificar. Siguiendo con la lista de frutas, supongamos que deseamos modificar el elemento "Sandia" por "Fresa", sabiendo que el elemento a modificar esta en la cuarta posición cuyo índice es 3. Veamos el siguiente código en acción:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print('Contenido de la lista de frutas antes de la modificación de la Sandia por Fresa:')
print(lListaFrutas)
lListaFrutas[3]='Fresa'
print('\nContenido de la lista de frutas luego de la modificación de la Sandia por Fresa:')
print(lListaFrutas)

El resultado es:

Contenido de la lista de frutas antes de la modificación de la Sandia por Fresa:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Contenido de la lista de frutas luego de la modificación de la Sandia por Fresa:
['Manzana', 'Pera', 'Uva', 'Fresa', 'Banana']

Como podemos comprobar se ha sustituido la cadena de caracteres Sandia por Fresa en la lista de índice 3.

También es posible modificar rangos de elementos usando el operador de rango dos puntos (:). Supongamos que deseamos cambiar los elementos Pera y Uva por Coco y Piña respectivamente. Como podemos ver aparecen seguidos en la lista en las posiciones 2 y 3 (indices 1 y 2). Veamos como se haría la modificación en una sola operación:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print('Contenido de la lista de frutas antes de la modificación de la Pera y Uva por Coco y Piña:')
print(lListaFrutas)
lListaFrutas[1:2]=['Coco','Piña']
print('\nContenido de la lista de frutas luego de la modificación de la Pera y Uva por Coco y Piña:')
print(lListaFrutas)

El resultado es el siguiente:

Contenido de la lista de frutas antes de la modificación de la Pera y Uva por Coco y Piña:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Contenido de la lista de frutas luego de la modificación de la Pera y Uva por Coco y Piña:
['Manzana', 'Coco', 'Piña', 'Uva', 'Sandia', 'Banana']

Podemos comprobar que con una sola instrucción usando el operador de asignación = y el rango de índices de la lista se logró cambiar varios elementos de la lista por otros diferentes.

Eliminación de elementos de una lista


En Python se pueden eliminar elementos de una lista de diferentes maneras, dependiendo de la necesidad en particular se usaría un método u otro.

Una manera de eliminar un elemento de una lista en Python es usando el comando DEL, la sintaxis del comando es como sigue: DEL <nombre de la lista [indice del elemento a eliminar]>. Sigamos con el ejemplo anterior de la lista de frutas y supongamos que deseamos eliminar un elemento de dicha lista. Veamos el comando DEL trabajando en el siguiente código:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print('Contenido de la lista de frutas antes de la eliminación de la Pera:')
print(lListaFrutas)
del lListaFrutas[1]
print('\nContenido de la lista de frutas luego de la eliminación de la Pera:')
print(lListaFrutas)

El resultado es el siguiente:

Contenido de la lista de frutas antes de la eliminación de la Pera:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Contenido de la lista de frutas luego de la eliminación de la Pera:
['Manzana', 'Uva', 'Sandia', 'Banana']

Como podemos comprobar se ha eliminado el elemento 'Pera' de la lista de frutas, invocando a la instrucción DEL y sabiendo previamente el índice del elemento que deseamos eliminar. También es posible eliminar un rango de elementos si éstos están en secuencia continua, valiéndonos del operador de rango (:) tal como se hizo en ejemplos anteriores al momento de modificar varios elementos almacenados en secuencia en una sola operación.

Supongamos ahora que deseamos eliminar los elementos 'Uva', 'Sandia' y 'Banana' de nuestra lista de frutas. Lo primero que notamos es que están seguidos unos de otros en la lista y conocemos el índice de el primer elemento. El elemento 'Uva' esta almacenado en la posición 3 por lo tanto utiliza el índice 4 de la lista, a partir de alli podemos eliminar los elementos pertenecientes al rango de índices 2:4, ya que esto eliminaría los elementos de índice 2, 3 y 4, usados por 'Uva', 'Sandia' y 'Banana' respectivamente, que es lo que deseamos hacer en un principio. Veamos como sería en la práctica:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print('Contenido de la lista de frutas antes de la eliminación del rango del 4 al 6:')
print(lListaFrutas)
del lListaFrutas[2:4]
print('\nContenido de la lista de frutas luego de la eliminación del rango del 4 al 6:')
print(lListaFrutas)

El resultado sería:

Contenido de la lista de frutas antes de la eliminación del rango del 4 al 6:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Contenido de la lista de frutas luego de la eliminación del rango del 4 al 6:
['Manzana', 'Pera', 'Banana']

La lista resultante es la que queríamos lograr usando el comando DEL aplicado a un rango de índices. Como nota adicional vale la pena destacar que si utilizamos el comando del con el rango sin definir los indices entonces el intérprete de Python eliminaría el rango completo de la lista, o lo que es lo mismo la vaciaría por completo. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print('Contenido de la lista de frutas antes de la eliminación del rango entero:')
print(lListaFrutas)
del lListaFrutas[:]
print('\nContenido de la lista de frutas luego de la eliminación del rango entero:')
print(lListaFrutas)

El resultado sería:

Contenido de la lista de frutas antes de la eliminación del rango entero:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Contenido de la lista de frutas luego de la eliminación del rango entero:
[]

Como se pudo comprobar, efectivamente se ha vaciado la lista por completo al usar el comando DEL con el rango vacío.
 
Este método de eliminación de elementos es muy útil para eliminar un elemento o un rango de elementos adyacentes sabiendo los índices que ocupan en la lista. Sin embargo si no se sabe el índice de la posición que ocupa el elemento que deseamos eliminar podemos usar el método .REMOVE(), la sintaxis del método es como sigue: .REMOVE(<descripción del elemento a eliminar>). No es necesario saber la posición que ocupa en la lista ni el índice, ya que el método .REMOVE() va a eliminar la primera coincidencia con la descripción suministrada que encuentre en la lista. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana','Uva']
print('Contenido de la lista de frutas antes de la eliminación del elemento "Uva":')
print(lListaFrutas)
lListaFrutas.remove('Uva')
print('\nContenido de la lista de frutas luego de la eliminación del elemento "Uva":')
print(lListaFrutas)

El resultado de ejecutar el código anterior es:

Contenido de la lista de frutas antes de la eliminación del elemento "Uva":
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Uva']

Contenido de la lista de frutas luego de la eliminación del elemento "Uva":
['Manzana', 'Pera', 'Sandia', 'Banana', 'Uva']

En este resultado podemos observar 2 cosas importantes. La primera es que efectivamente el método .REMOVE() quitó de la lista el elemento que almacenaba en la lista la cadena 'Uva". Lo segundo es que eliminó solamente la primera coincidencia que encontró en la lista como se había previsto.

También puede resultar muy útil mostrar un mensaje indicándole al usuario la eliminación de un elemento de la lista y eliminarlo en la misma operación. Para ello podemos valernos del método .POP(), el cual acepta un entero como valor del índice donde se encuentra el elemento que se desea eliminar y en caso de omitirse elimina el último elemento de la lista. Consideremos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana','Uva']
print('Contenido de la lista de frutas antes de la eliminación del elemento del índice 3:')
print(lListaFrutas)
print(f"\nSe ha eliminado satisfactoriamente el elemento: {lListaFrutas.pop(3)}")
print('\nContenido de la lista de frutas luego de la eliminación del elemento del índice 3:')
print(lListaFrutas)

El resultado de este código sería:

Contenido de la lista de frutas antes de la eliminación del elemento del índice 3:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Uva']

Se ha eliminado satisfactoriamente el elemento: Sandia

Contenido de la lista de frutas luego de la eliminación del elemento del índice 3:
['Manzana', 'Pera', 'Uva', 'Banana', 'Uva']

Como podemos comprobar se ha eliminado efectivamente el elemento almacenado en la lista bajo el índice 3, y en una misma operación se ha anunciado al usuario dicha operación.

Otro ejemplo del uso del método .POP() seria como sigue:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana','Uva']
print('Contenido de la lista de frutas antes de la eliminación del último elemento de la lista:')
print(lListaFrutas)
print(f"\nSe ha eliminado satisfactoriamente el último elemento: {lListaFrutas.pop()}")
print('\nContenido de la lista de frutas luego de la eliminación del último elemento de la lista:')
print(lListaFrutas)

El resultado de la ejecución de este código es:

Contenido de la lista de frutas antes de la eliminación del último elemento de la lista:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Uva']

Se ha eliminado satisfactoriamente el último elemento: Uva

Contenido de la lista de frutas luego de la eliminación del último elemento de la lista:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']

Efectivamente hemos podido comprobar que el método .POP() sin argumentos asume que el elemento al que se hace referencia es al último de la lista, en este caso eliminando el elemento 'Uva'

Ahora bien si deseamos vaciar por completo la lista, podemos acceder al procedimiento .CLEAR(), sin argumentos. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana','Uva']
print('Contenido de la lista de frutas antes de la eliminación todos los elementos de la lista:')
print(lListaFrutas)
lListaFrutas.clear()
print('\nContenido de la lista de frutas luego de la eliminación de todos los elementos de la lista:')
print(lListaFrutas)

El resultado de la ejecución del código anterior es:

Contenido de la lista de frutas antes de la eliminación todos los elementos de la lista:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Uva']

Contenido de la lista de frutas luego de la eliminación de todos los elementos de la lista:
[]

Como podemos comprobar el método .CLEAR() ha eliminado todos los elementos de la lista lListaFrutas en una sola operación.

Una función importante al manipular listas es la función LEN(), como ya hemos visto en el apartado de bucles de repetición, se utiliza para conocer la longitud de un objeto iterable, en el caso de las listasm al ser n objeto iterable, se puede saber su longitud o lo que es lo mismo, la cantidad de elementos que la componen. Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana','Uva']
print('Contenido de la lista de frutas:')
print(lListaFrutas)
print(f'La lista lListaFrutas contiene {len(lListaFrutas)} elementos')

En todo caso en el apartado de funciones incorporadas en Python se detalla mas a fondo el uso de la función LEN() y su prototipo.

Conocer la presencia de un elemento en una lista

¿Qué sucede si deseamos saber si un elemento existe en un lista? Podemos acudir al operador de pertenencia IN, visto previamente en el apartado operadores en Python.Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana','Uva']
print(f'Contenido de la lista de frutas: {lListaFrutas}')
if 'Banana' in lListaFrutas:
    print(f'La fruta Banana SI se encuentra en la lista de frutas')
else:
    print(f'La fruta Banana NO se encuentra en la lista de frutas')
if 'Piña' in lListaFrutas:
    print('La fruta Piña SI se encuentra en la lista de frutas')
else:
    print('La fruta Piña NO se encuentra en la lista de frutas')

el resultado es:

Contenido de la lista de frutas: ['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana', 'Uva']
La fruta Banana SI se encuentra en la lista de frutas
La fruta Piña NO se encuentra en la lista de frutas

Como se puede comprobar con el operador de pertenencia IN podemos saber si un elemento esta o no en una lista.

Orden de los elementos de una lista

Por defecto los elementos de una lista estan ordenados en el mismo orden en que han sido creados, sin embargo puede resultar conveniente cambiar este orden. Para ello nos valdremos del método .SORT().

Supongamos que deseamos ordenar de manera alfabética ascendente la lista de frutas, veamos como hacerlo con el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
print(f'Contenido de la lista de frutas en el orden en que fue creada:')
print(lListaFrutas)
lListaFrutas.sort(reverse=True)
print(f'Contenido de la lista de frutas en orden descendente: {lListaFrutas}')
print(lListaFrutas)

Resultado:

Contenido de la lista de frutas en el orden en que fue creada:
['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']
Contenido de la lista de frutas en orden descendente: ['Uva', 'Sandia', 'Pera', 'Manzana', 'Banana']
['Uva', 'Sandia', 'Pera', 'Manzana', 'Banana']

Como podemos ver el método .SORT() admite un parámetro boleano para indicarle si debe o no ordenar en orden inverso la lista. Por defecto este valor esta en FALSE, asi que no es necesario escribirlo para ordenar de manera ascendente.

El puede ver mas detalles del uso del método .SORT() en el apartado métodos incorporados en Python.

Enumerar listas

Como se ha podido ver hasta ahora los índices permiten hacer referencia a la posición de los elementos dentro de una lista. Estos índices son creados y manipulados automáticamente por Python.  Por ello no es posible, modificar y manipular dichos valores, ya que el espíritu de Python es el de simplificar y quitarle esta carga de trabajo al programador a la hora de iterar un objeto, evitando así la necesidad de usar una variable a modo de contador para llevar el control de la posición del elemento dentro del objeto iterable, como ocurre en otros lenguajes de programación.

Sin embargo, se pueden dar situaciones en las cuales sea necesario tener una variable que vaya cambiando durante el recorrido de un objeto iterable. Python facilita esta tarea con la implementación de la función incorporada ENUMERATE() La función ENUMERATE() recibe como argumento un objeto iterable y lo devuelve como un objeto enumerado, es decir, un objeto que se puede recorrer a traves de un bucle de repetición o se puede convertir a lista a través de la función incorporada LIST().

Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']

print(f'Frutas sin enumerar: {lListaFrutas}')

FrutasEnumeradas = list(enumerate(lListaFrutas))

print(f'Frutas enumeradas: {FrutasEnumeradas}')

for i,x in FrutasEnumeradas:
    print(f'\nIteración: {i} --> Elemento: {x}')

Da como resultado:

Frutas sin enumerar: ['Manzana', 'Pera', 'Uva', 'Sandia', 'Banana']
Frutas enumeradas: [(0, 'Manzana'), (1, 'Pera'), (2, 'Uva'), (3, 'Sandia'), (4, 'Banana')]

Iteración: 0 --> Elemento: Manzana

Iteración: 1 --> Elemento: Pera

Iteración: 2 --> Elemento: Uva

Iteración: 3 --> Elemento: Sandia

Iteración: 4 --> Elemento: Banana

Como se puede comprobar la función ENUMERATE() devuelve un objeto enumerado (susceptible a convertirse en en lista a través de la función LIST() ) recibiendo una lista como argumento, facilitando así el uso y manipulación de un contador para enumerar los elementos de una lista.

Convertir una lista a tupla

Como se mencionó anteriormente una tupla es otro tipo de dato en Python que se abordará con mas detalle en el apartado de Tuplas, sin embargo, de momento es suficiente saber que las tuplas son un tipo de dato muy parecido a las listas en su estructura y funcionamiento,  con la diferencia que son fijas, es decir una vez creadas no se puede alterar sus elementos.

Es posible convertir las listas a tuplas, así como la función list() convierte a lista un objeto, la instrucción TUPLE() convierte a tupla un objeto iterable.

Veamos el siguiente ejemplo:

lListaFrutas = ['Manzana','Pera','Uva','Sandia','Banana']
tListaFruta = tuple(lListaFrutas)
print(f'Lista de frutas  convertida a tupla: {tListaFruta}')
print(f'Tipo de dato del objeto tListaTupla: {type(tListaFruta)}')

El resultado sería:

Lista de frutas  convertida a tupla: ('Manzana', 'Pera', 'Uva', 'Sandia', 'Banana')
Tipo de dato del objeto tListaTupla: <class 'tuple'>

Como podemos ver, al imprimir el objeto tListaFrutas que contiene la estructura devuelta por la función TUPLE(), la cual se había invocado pasando como argumento la lista de frutas, Python muestra por pantalla una estructura similar en contenido y orden a la lista lListaFrutas, con la salvedad que está encerrada entre paréntesis (), no entre corchetes, esto es debido a que el objeto tListaFrutas es una tupla y las tuplas como se verá en el apartado de Tuplas, se representan en Python encerrando sus elementos entre parentésis. Ademas que, como se puede apreciar en el resultado de la ejecución del código, el resultado de la función TYPE() sobre el objeto lListaFrutas luego de haberse convertido a tupla es <class 'tuple'> o lo que es lo mismo que Python lo reconoce como un objeto tipo tupla.

Comentarios

Entradas populares