20 - Listas: componentes de tipo lista

Hasta ahora hemos trabajado con listas cuyos componentes son de tipo:

enteros
flotantes
cadenas de caracteres

Ejemplo

notas=[8, 6, 8]
alturas=[1.73, 1.55, 1.92]
dias=["lunes", "martes", "miércoles"]

Pero lo que la hace tan flexible a esta estructura de datos es que podemos almacenar componentes de tipo LISTA.

notas=[[4,5], [6,9], [7,3]]

En la línea anterior hemos definido una lista de tres elementos de tipo lista, el primer elemento de la lista es otra lista de dos elementos de tipo entero. De forma similar los otros dos elementos de la lista notas son listas de dos elementos de tipo entero.

Problema 1:

Crear una lista por asignación. La lista tiene que tener cuatro elementos. Cada elemento debe ser una lista de 3 enteros.
Imprimir sus elementos accediendo de diferentes modos.

Programa: ejercicio95.py

Ver video

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

# imprimimos la lista completa
print(lista)
print("---------")
# imprimimos la primer componente
print(lista[0])
print("---------")
# imprimimos la primer componente de la lista contenida
# en la primer componente de la lista principal
print(lista[0][0])
print("---------")
# imprimimos con un for la lista contenida en la primer componente
for x in range(len(lista[0])):
    print(lista[0][x])
print("---------")               
# imprimimos cada elemento entero de cada lista contenida en la lista
for k in range(len(lista)):
    for x in range(len(lista[k])):
        print(lista[k][x])

El resultado de ejecutar este programa es:

listas con componente tipo listas en python

Al principio puede complicarse trabajar con listas de listas pero a medida que practiquemos esta estructura de datos veremos que podemos desarrollar algoritmos más complejos.

Para definir y crear por asignación una lista de listas tenemos:

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

Queda claro que el primer elemento de lista es:

[1,2,3]

El segundo elemento de la variable lista es (y así sucesivamente):

[4,5,6]

La función print si le pasamos como parámetro el nombre de la lista nos muestra la lista completa por pantalla:

print(lista)

Aparece:

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

Cuando pasamos a la función print el primer elemento de la lista:

print(lista[0])

Nos muestra la lista contenida en la primer componente de la lista principal:

[1, 2, 3]

Si queremos acceder al primer entero almacenado en la lista contenida en la primer componente de la lista principal:

print(lista[0][0])

Nos muestra:

1

Para acceder mediante un for a todos los elementos de la lista contenida en la primer componente de la lista principal debemos codificar:

for x in range(len(lista[0])):
    print(lista[0][x])

Recordemos que la función len retorna la cantidad de elementos que contiene una lista. En este caso le pasamos como parámetro lista[0] que hace referencia a la primer componente de la lista principal.

El resultado de len(lista[0]) es un 3 que es la cantidad de elementos que tiene la lista contenida en la primer componente de la lista principal.

Cada ciclo del for accedemos a: lista[0][0] cuando x vale 0, lista[0][1] cuando x vale 1 y lista[0][2] cuando x vale 2.

Mediante este ciclo podemos acceder a cada elemento y procesarlo.

Por último con el ciclo anidado k podemos acceder a cada elemento de la lista principal y mediante el for interno acceder a cada elemento entero de las listas contenidas en la lista principal:

for k in range(len(lista)):
    for x in range(len(lista[k])):
        print(lista[k][x])

Problema 2:

Crear una lista por asignación. La lista tiene que tener 2 elementos. Cada elemento debe ser una lista de 5 enteros.
Calcular y mostrar la suma de cada lista contenida en la lista principal.

Programa: ejercicio96.py

Ver video

lista=[[1,1,1,1,1], [2,2,2,2,2]]

suma1=lista[0][0]+lista[0][1]+lista[0][2]+lista[0][3]+lista[0][4]
print(suma1)
suma2=lista[1][0]+lista[1][1]+lista[1][2]+lista[1][3]+lista[1][4]
print(suma2)
print("----------")

suma1=0
for x in range(len(lista[0])):
    suma1=suma1+lista[0][x]
suma2=0
for x in range(len(lista[1])):
    suma2=suma2+lista[1][x]
print(suma1)
print(suma2)
print("----------")

for k in range(len(lista)):
    suma=0
    for x in range(len(lista[k])):
        suma=suma+lista[k][x]
    print(suma)

Hemos resuelto el problema de tres formas.

La primer forma es acceder a cada elemento en forma secuencial, esto se resuelve de esta forma si tenemos que acceder a un pequeño número de elementos, es decir si la lista es pequeña:

suma1=lista[0][0]+lista[0][1]+lista[0][2]+lista[0][3]+lista[0][4]
print(suma1)
suma2=lista[1][0]+lista[1][1]+lista[1][2]+lista[1][3]+lista[1][4]
print(suma2)

La segunda forma es utilizar una estructura repetitiva para sumar todos los elementos de una lista (el primer subíndice siempre es 0 y el segundo varía con la variable x):

suma1=0
for x in range(len(lista[0])):
    suma1=suma1+lista[0][x]
suma2=0
for x in range(len(lista[1])):
    suma2=suma2+lista[1][x]
print(suma1)
print(suma2)

La última forma planteada es utilizar una estructura repetitiva anidada que suma cada fila, el for externo (k) se repite 2 veces que es el tamaño de la variable "lista":

for k in range(len(lista)):
    suma=0
    for x in range(len(lista[k])):
        suma=suma+lista[k][x]
    print(suma)

Es importante notar que el acumulador suma lo iniciamos en 0 cada vez que comenzamos a sumar una nueva lista.

Problema 3:

Crear una lista por asignación. La lista tiene que tener 5 elementos. Cada elemento debe ser una lista, la primera lista tiene que tener un elemento, la segunda dos elementos, la tercera tres elementos y así sucesivamente.
Sumar todos los valores de las listas.

Programa: ejercicio97.py

Ver video

lista=[[1], [1,2], [1,2,3], [1,2,3,4], [1,2,3,4,5]]

suma=0
for k in range(len(lista)):
    for x in range(len(lista[k])):
        suma=suma+lista[k][x]
print(suma)

Lo primero que es importante notar que las listas contenidas en las lista principal no tienen porque ser del mismo tamaño.

La forma más sencilla es utilizar dos ciclos repetitivos. El primero se repite tantas veces como elementos tenga la lista principal:

for k in range(len(lista)):

El segundo ciclo nos sirve para recorrer y acceder a cada elemento entero de cada lista:

    for x in range(len(lista[k])):
        suma=suma+lista[k][x]

La cantidad de veces que se repite el for interno depende de la cantidad de elementos que tiene la lista que estamos sumando en ese momento.

Problemas propuestos

  • Se tiene la siguiente lista:
    lista=[[100,7,85,8], [4,8,56,25], [67,89,23,1], [78,56]]
    
    Imprimir la lista. Luego fijar con el valor cero todos los elementos mayores a 50 del primer elemento de "lista".
    Volver a imprimir la lista.

    Ver video

  • Se tiene la siguiente lista:
    lista=[[4,12,5,66], [14,6,25], [3,4,5,67,89,23,1], [78,56]]
    
    Imprimir la lista. Luego fijar con el valor cero todos los elementos mayores a 10 contenidos en todos los elementos de la variable "lista".
    Volver a imprimir la lista.

    Ver video

  • Crear una lista por asignación con la cantidad de elementos de tipo lista que usted desee. Luego imprimir el último elemento de la lista principal.

    Ver video

Solución
ejercicio98.py

lista=[[100,7,85,8], [4,8,56,25], [67,89,23,1], [78,56]]

print(lista)

for x in range(len(lista[0])):
    if lista[0][x]>50:
        lista[0][x]=0

print(lista)




ejercicio99.py

lista=[[4,12,5,66], [14,6,25], [3,4,5,67,89,23,1], [78,56]]

print(lista)

for k in range(len(lista)):
    for x in range(len(lista[k])):
        if lista[k][x]>10:
            lista[k][x]=0
            
print(lista)    




ejercicio100.py

lista=[["juan","ana"], ["luis"], ["pedro","carlos","maria"]]
print(lista[len(lista)-1])