21 - Listas: carga por teclado de componentes de tipo lista

En el concepto anterior vimos que fácilmente podemos definir por asignación una lista cuyas componentes sean también listas:

lista=[[1,2,3], [7,4], [9,2]]

En muchas situaciones debemos crear una nueva lista ingresando los datos por teclado o por operaciones del mismo programa.

Problema 1:

Crear y cargar una lista con los nombres de tres alumnos. Cada alumno tiene dos notas, almacenar las notas en una lista paralela. Cada componente de la lista paralela debe ser también una lista con las dos notas. Imprimir luego cada nombre y sus dos notas.

Si cargáramos los datos por asignación sería algo parecido a esto:

alumnos=["juan", "ana", "luis"]
notas=[[10,8], [6,5], [2,8]]

En la componente 0 de la lista alumnos tenemos almacenado el nombre "juan" y como son listas paralelas en la componente 0 de la lista notas tenemos almacenado una lista con las dos notas 10 y 8.

Nuestro objetivo como lo pide el problema es cargar los datos por teclado.

Programa: ejercicio101.py

Ver video

nombres=[]
notas=[]
for x in range(3):
    nom=input("Ingrese el nombre del alumno:")
    nombres.append(nom)
    no1=int(input("Ingrese la primer nota:"))
    no2=int(input("Ingrese la segunda nota:"))
    notas.append([no1,no2])

for x in range(3):
    print(nombres[x],notas[x][0],notas[x][1])

La ejecución del programa tiene una salida por pantalla similar a:

carga de lista de listas en python por teclado

La creación de las dos listas no difiere una de otra:

nombres=[]
notas=[]

En la estructura repetitiva for procedemos a cargar un nombre y agregarlo a la lista en forma similar como lo hemos hecho en conceptos anteriores:

for x in range(3):
    nom=input("Ingrese el nombre del alumno:")
    nombres.append(nom)

Lo nuevo se presenta cuando queremos añadir elementos a la lista notas, lo hacemos con el mismo método append pero le pasamos como parámetro una lista con dos elementos:

    no1=int(input("Ingrese la primer nota:"))
    no2=int(input("Ingrese la segunda nota:"))
    notas.append([no1,no2])

Cuando imprimimos el nombre lo accedemos por un solo subíndice, pero para acceder a cada una de las notas debemos indicar dos subíndices, el primer subíndice es con respecto a que elemento accedemos de la lista principal y el segundo subíndice hace referencia a la lista contenida en dicha componente:

for x in range(3):
    print(nombres[x],notas[x][0],notas[x][1])

Problema 2:

Se tiene que cargar la siguiente información:
· Nombres de 3 empleados
· Ingresos en concepto de sueldo, cobrado por cada empleado, en los últimos 3 meses.
Confeccionar el programa para:

a) Realizar la carga de los nombres de empleados y los tres sueldos por cada empleado.
b) Generar una lista que contenga el ingreso acumulado en sueldos en los últimos 3 meses para cada empleado.
c) Mostrar por pantalla el total pagado en sueldos a cada empleado en los últimos 3 meses
d) Obtener el nombre del empleado que tuvo el mayor ingreso acumulado

En este problema definiremos tres listas:

Una lista para almacenar los nombres de los empleados, por ejemplo si lo cargamos por asignación:
nombres=["juan", "ana", "luis"]
Una lista paralela a la anterior para almacenar los sueldos en los últimos tres meses por cada empleado:

sueldos=[[5000,5100,5000], [7000,6500,6000], [2500,2500,2500]]

Otra lista paralela donde almacenamos el total de sueldos cobrados por cada empleado que resulta de sumar los tres sueldos de cada empleado contenidos en la lista sueldos:

totalsueldos=[15100, 19500, 7500]

Es importante notar que estos datos no los cargaremos por asignación sino los cargaremos por teclado a las dos primeras listas y la tercera la generaremos extrayendo los datos de la lista sueldos.

Programa: ejercicio102.py

Ver video

nombres=[]
sueldos=[]
totalsueldos=[]

for x in range(3):
    nom=input("Ingrese el nombre del empleado:")
    nombres.append(nom)
    su1=int(input("Ingrese el primer sueldo:"))
    su2=int(input("Ingrese el segundo sueldo:"))
    su3=int(input("Ingrese el tercer sueldo:"))
    sueldos.append([su1, su2, su3])

for x in range(3):
    total=sueldos[x][0]+sueldos[x][1]+sueldos[x][2]
    totalsueldos.append(total)

for x in range(3):
    print(nombres[x], totalsueldos[x])

posmayor=0
mayor=totalsueldos[0]
for x in range(1,3):
    if totalsueldos[x]>mayor:
        mayor=totalsueldos[x]
        posmayor=x
print("Empleado con mayores ingresos en los ultimos tres meses")
print(nombres[posmayor])
print("con un ingreso de",mayor)

Definimos 3 listas:

nombres=[]
sueldos=[]
totalsueldos=[]

En el primer for realizamos la carga de cada nombre de empleado y sus tres últimos sueldos, en la lista nombres añadimos strings y en la lista sueldos añadimos otra lista con tres enteros que representan los sueldos:

for x in range(3):
    nom=input("Ingrese el nombre del empleado:")
    nombres.append(nom)
    su1=int(input("Ingrese el primer sueldo:"))
    su2=int(input("Ingrese el segundo sueldo:"))
    su3=int(input("Ingrese el tercer sueldo:"))
    sueldos.append([su1, su2, su3])

En el segundo ciclo repetitivo generamos automáticamente la lista totalsueldos (es decir no cargamos por teclado), este valor resulta de sumar los tres sueldos de cada empleado que se encuentran en cada una de las listas contenidas en la lista sueldos:

for x in range(3):
    total=sueldos[x][0]+sueldos[x][1]+sueldos[x][2]
    totalsueldos.append(total)

Imprimimos ahora el nombre del empleado seguido por el ingreso total en sueldos de los últimos tres meses:

for x in range(3):
    print(nombres[x], totalsueldos[x])

Finalmente el problema requiere mostrar el nombre del empleado que recaudó más en sueldos en los últimos tres meses.
Iniciamos dos variables previas al for indicando en una la posición de importe en sueldos mayor y en otra dicho importe. Hacemos la suposición antes de ingresar al for que el mayor está en la posición 0:

posmayor=0
mayor=totalsueldos[0]

Disponemos un for cuya variable se inicia en 1 y dentro del for controlamos el importe del total de sueldos si supera al que hemos considerado mayor hasta ese momento "mayor" procedemos a actualizar las dos variables: mayor y posmayor:

for x in range(1,3):
    if totalsueldos[x]>mayor:
        mayor=totalsueldos[x]
        posmayor=x

Finalmente cuando salimos del ciclo procedemos a mostrar el nombre del empleado que recaudó más en los últimos tres meses:

print("Empleado con mayores ingresos en los ultimos tres meses")
print(nombres[posmayor])
print("con un ingreso de",mayor)

Problema 3:

Solicitar por teclado dos enteros. El primer valor indica la cantidad de elementos que crearemos en la lista. El segundo valor indica la cantidad de elementos que tendrá cada una de las listas internas a la lista principal.
Mostrar la lista y la suma de todos sus elementos.

Por ejemplo si el operador carga un 2 y un 4 significa que debemos crear una lista similar a:

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

Programa: ejercicio103.py

Ver video

lista=[]
elementos=int(input("Cuantos elementos tendra la lista:"))
sub=int(input("Cuantos elementos tendran las listas internas:"))
for k in range(elementos):
    lista.append([])
    for x in range(sub):
        valor=int(input("Ingrese valor:"))
        lista[k].append(valor)

print(lista)

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

print("La suma de todos sus elementos:",suma)        

Lo primero que hacemos en este problema además de definir la lista es cargar dos enteros por teclado:

lista=[]
elementos=int(input("Cuantos elementos tendra la lista:"))
sub=int(input("Cuantos elementos tendran las listas internas:"))

El primer for se repetirá tantas veces como indica el primer valor ingresado por teclado almacenado en la variable "elementos", cada vuelta de este for se crea un elemento en la "lista" y se carga una lista vacía []:

for k in range(elementos):
    lista.append([])

En el for interior procedemos a cargar tantos valores como lo indicamos en la variable "sub" y los vamos añadiendo en la lista vacía que creamos antes de este for:

    for x in range(sub):
        valor=int(input("Ingrese valor:"))
        lista[k].append(valor)

Finalmente para sumar todos los elementos enteros almacenados en "lista" debemos disponer estructuras repetitivas anidadas:

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

El for de las "k" se repite tantas veces como elementos tenga "lista" y el for de las x se repite tantas veces como elementos tenga la lista en la posición k.

lista de listas en python

Problema 4:

Definir dos listas de 3 elementos.
La primer lista cada elemento es una sublista con el nombre del padre y la madre de una familia.
La segunda lista está constituida por listas con los nombres de los hijos de cada familia. Puede haber familias sin hijos.
Imprimir los nombres del padre, la madre y sus hijos.
También imprimir solo el nombre del padre y la cantidad de hijos que tiene dicho padre.

Un ejemplo si se define por asignación:

padres=[["juan","ana"], ["carlos","maria"], ["pedro","laura"]]
hijos=[["marcos","alberto","silvia"], [], ["oscar"]]

Como son listas paralelas podemos decir que la familia cuyos padres son "juan" y "ana" tiene tres hijos llamados "marcos", "alberto", "silvia". La segunda familia no tiene hijos y la tercera tiene solo uno.

Programa: ejercicio104.py

Ver video

padres=[]
hijos=[]
for k in range(3):
    pa=input("Ingrese el nombre del padre:")
    ma=input("Ingrese el nombre de la madre:")    
    padres.append([pa, ma])
    cant=int(input("Cuantos hijos tienen esta familia:"))
    hijos.append([])
    for x in range(cant):
        nom=input("Ingrese el nombre del hijo:")
        hijos[k].append(nom)

print("Listado del padre, madre y sus hijos")
for k in range(3):
    print("Padre:",padres[k][0])
    print("Madre:",padres[k][1])
    for x in range(len(hijos[k])):
        print("Hijo:",hijos[k][x])

print("Listado del padre y cantidad de hijos que tiene")
for x in range(3):
    print("padre:",padres[x][0])
    print("Cantidad de hijos:",len(hijos[x]))

Comenzamos definiendo las dos listas:

padres=[]
hijos=[]

El primer for es para cargar y crear cada elemento de la lista "padres", crear una elemento de la lista hijos con una lista vacía y solicitar que se cargue cuantos hijos tiene la familia:

for k in range(3):
    pa=input("Ingrese el nombre del padre:")
    ma=input("Ingrese el nombre de la madre:")    
    padres.append([pa, ma])
    cant=int(input("Cuantos hijos tienen esta familia:"))
    hijos.append([])

El for interno se ingresan los nombres de los hijos y se agregan a la lista hijos en la posición respectiva. El for interno puede llegar a no ejecutarse si se ingresa un 0 en cantidad de hijos:

    for x in range(cant):
        nom=input("Ingrese el nombre del hijo:")
        hijos[k].append(nom)

Para imprimir los nombres de ambos padres y sus hijos también implementamos un for anidado:

print("Listado del padre, madre y sus hijos")
for k in range(3):
    print("Padre:",padres[k][0])
    print("Madre:",padres[k][1])
    for x in range(len(hijos[k])):
        print("Hijo:",hijos[k][x])

Para mostrar la cantidad de hijos que tiene un determinado padre llamamos a la función len de cada una de las sublistas contenidas en la lista hijos:

print("Listado del padre y cantidad de hijos que tiene")
for x in range(3):
    print("padre:",padres[x][0])
    print("Cantidad de hijos:",len(hijos[x]))

Problemas propuestos

  • Se desea saber la temperatura media trimestral de cuatro paises. Para ello se tiene como dato las temperaturas medias mensuales de dichos paises.
    Se debe ingresar el nombre del país y seguidamente las tres temperaturas medias mensuales.
    Seleccionar las estructuras de datos adecuadas para el almacenamiento de los datos en memoria.
    a - Cargar por teclado los nombres de los paises y las temperaturas medias mensuales.
    b - Imprimir los nombres de las paises y las temperaturas medias mensuales de las mismas.
    c - Calcular la temperatura media trimestral de cada país.
    c - Imprimir los nombres de los paises y las temperaturas medias trimestrales.
    b - Imprimir el nombre del pais con la temperatura media trimestral mayor.

    Ver video

  • Definir una lista y almacenar los nombres de 3 empleados.
    Por otro lado definir otra lista y almacenar en cada elemento una sublista con los números de días del mes que el empleado faltó.
    Imprimir los nombres de empleados y los días que faltó.
    Mostrar los empleados con la cantidad de inasistencias.
    Finalmente mostrar el nombre o los nombres de empleados que faltaron menos días.

    Ver video

  • Desarrollar un programa que cree una lista de 50 elementos. El primer elemento es una lista con un elemento entero, el segundo elemento es una lista de dos elementos etc.
    La lista debería tener esta estructura y asignarle esos valores a medida que se crean los elementos:
    [[1], [1,2], [1,2,3], [1,2,3,4], [1,2,3,4,5], etc....]
    

    Ver video

Solución
ejercicio105.py

paises=[]
temperaturas=[]
promediotemp=[]

for x in range(4):
    nom=input("Ingrese el nombre del pais:")
    paises.append(nom)
    temp1=int(input("Ingrese primer temperatura:"))
    temp2=int(input("Ingrese segunda temperatura:"))
    temp3=int(input("Ingrese tercer temperatura:"))
    temperaturas.append([temp1, temp2, temp3])

print("Paises y temperaturas medias de los ultimos tres meses mensuales")
for x in range(4):
    print(paises[x],temperaturas[x][0],temperaturas[x][1],temperaturas[x][2])

for x in range(4):
    pro=(temperaturas[x][0]+temperaturas[x][1]+temperaturas[x][2])//3
    promediotemp.append(pro)

print("Paises y temperaturas medias trimestrales")
for x in range(4):
    print(paises[x],promediotemp[x])

posmayor=0
for x in range(1,4):
    if promediotemp[x]>promediotemp[posmayor]:
        posmayor=x
print("Pais con temperatura media trimestral mayor:", paises[posmayor])




ejercicio106.py

empleados=[]
faltas=[]

for k in range(3):
    nom=input("Ingrese el nombre de empleado:")
    empleados.append(nom)
    cant=int(input("Cuantos dias falto:"))
    faltas.append([])
    for x in range(cant):
        dia=int(input("Ingrese el numero de dia que falto:"))
        faltas[k].append(dia)

print("Nombres de empleados y dias que falto")
for k in range(3):
    print(empleados[k])
    for x in range(len(faltas[k])):
        print(faltas[k][x])

print("Nombres de empleados y cantidad de inasistencias")
for x in range(3):
    print(empleados[x],len(faltas[x]))

men=len(faltas[0])
for x in range(1,3):
    if len(faltas[x])<men:
        men=len(faltas[x])

print("Empleado o empleados que faltaron menos")
for x in range(3):
    if len(faltas[x])==men:
           print(empleados[x])




ejercicio107.py

lista=[]
cant=1
for k in range(50):
    lista.append([])
    valor=1
    for x in range(cant):
        lista[k].append(valor)
        valor=valor+1
    cant=cant+1

print(lista)