35 - Diccionarios: con valores de tipo listas, tuplas y diccionarios

Lo más poderoso que podemos encontrar en las estructuras de datos en Python es que podemos definir elementos que sean también estructuras de datos. En general se dice que podemos anidar una estructura de datos dentro de otra estructura de datos.

Ya vimos en conceptos anteriores que podemos definir elementos de una lista que sean también de tipo lista o de tipo tupla.

Hemos dicho que un diccionario consta de claves y valores para esas claves. Desarrollaremos problemas donde los valores para esas claves sean tuplas y o listas.

Problema 1:

Confeccionar un programa que permita cargar un código de producto como clave en un diccionario. Guardar para dicha clave el nombre del producto, su precio y cantidad en stock.
Implementar las siguientes actividades:
1) Carga de datos en el diccionario.
2) Listado completo de productos.
3) Consulta de un producto por su clave, mostrar el nombre, precio y stock.
4) Listado de todos los productos que tengan un stock con valor cero.

Programa: ejercicio163.py

Ver video

def cargar():
    productos={}
    continua="s"
    while continua=="s":
        codigo=int(input("Ingrese el codigo del producto:"))
        descripcion=input("Ingrese la descripcion:")
        precio=float(input("Ingrese el precio:"))
        stock=int(input("Ingrese el stock actual:"))
        productos[codigo]=(descripcion,precio,stock)
        continua=input("Desea cargar otro producto[s/n]?")
    return productos


def imprimir(productos):
    print("Listado completo de productos:")
    for codigo in productos:
        print(codigo,productos[codigo][0],productos[codigo][1],productos[codigo][2])


def consulta(productos):
    codigo=int(input("Ingrese el codigo de articulo a consultar:"))
    if codigo in productos:
        print(productos[codigo][0],productos[codigo][1],productos[codigo][2])
        

def listado_stock_cero(productos):
    print("Listado de articulos con stock en cero:")
    for codigo in productos:
        if productos[codigo][2]==0:
            print(codigo,productos[codigo][0],productos[codigo][1],productos[codigo][2])



# bloque principal

productos=cargar()
imprimir(productos)
consulta(productos)
listado_stock_cero(productos)

La función de cargar crea un diccionario llamado "productos" y mediante una estructura repetitiva añadimos en cada vuelta en el diccionario una entrada. La clave del diccionario es el código del producto y el valor del diccionario es una tupla que almacena la descripción del producto, su precio y su stock:

def cargar():
    productos={}
    continua="s"
    while continua=="s":
        codigo=int(input("Ingrese el codigo del producto:"))
        descripcion=input("Ingrese la descripcion:")
        precio=float(input("Ingrese el precio:"))
        stock=int(input("Ingrese el stock actual:"))
        productos[codigo]=(descripcion,precio,stock)
        continua=input("Desea cargar otro producto[s/n]?")
    return productos

En la función de imprimir recorremos el diccionario mediante un for in y recuperamos en cada paso una clave y mediante esta accedemos al valor que como sabemos se trata de una tupla que contiene 3 elementos:

def imprimir(productos):
    print("Listado completo de productos:")
    for codigo in productos:
        print(codigo,productos[codigo][0],productos[codigo][1],productos[codigo][2])

Para la consulta por el codigo del artículo ingresamos un entero por teclado y luego verificamos si dicho número está como clave dentro del diccionario productos, en el caso afirmativo mostramos los valores de la tupla:

def consulta(productos):
    codigo=int(input("Ingrese el codigo de articulo a consultar:"))
    if codigo in productos:
        print(productos[codigo][0],productos[codigo][1],productos[codigo][2])

Finalmente la función para listar todos los artículos con stock en cero procedemos a analizar el stock de cada producto dentro de un for, en el caso que la tercer componente de la tupla almacena un cero significa que no hay productos en stock:

def listado_stock_cero(productos):
    print("Listado de articulos con stock en cero:")
    for codigo in productos:
        if productos[codigo][2]==0:
            print(codigo,productos[codigo][0],productos[codigo][1],productos[codigo][2])

Problema 2:

Confeccionar una agenda. Utilizar un diccionario cuya clave sea la fecha. Permitir almacenar distintas actividades para la misma fecha (se ingresa la hora y la actividad)
Implementar las siguientes funciones:
1) Carga de datos en la agenda.
2) Listado completo de la agenda.
3) Consulta de una fecha.

Programa: ejercicio164.py

Ver video

def cargar():
    agenda={}
    continua1="s"
    while continua1=="s":
        fecha=input("ingrese la fecha con formato dd/mm/aa:")
        continua2="s"
        lista=[]
        while continua2=="s":
            hora=input("Ingrese la hora de la actividad con formato hh:mm ")
            actividad=input("Ingrese la descripcon de la actividad:")
            lista.append((hora,actividad))
            continua2=input("Ingresa otra actividad para la misma fecha[s/n]:")
        agenda[fecha]=lista
        continua1=input("Ingresa otra fecha[s/n]:")
    return agenda


def imprimir(agenda):
    print("Listado completa de la agenda")
    for fecha in agenda:
        print("Para la fecha:",fecha)
        for hora,actividad in agenda[fecha]:
            print(hora,actividad)


def consulta_fecha(agenda):
    fecha=input("Ingrese la fecha que desea consultar:")
    if fecha in agenda:
        for hora,actividad in agenda[fecha]:
            print(hora,actividad)
    else:
        print("No hay actividades agendadas para dicha fecha")
            

# bloque principal

agenda=cargar()
imprimir(agenda)
consulta_fecha(agenda)

Un ejemplo de ejecutar este programa tenemos la siguiente pantalla:

diccionarios con valores de tipo lista,tupla y diccionario

La carga de la agenda se compone de dos estructuras repetitivas anidadas.

Previo a comenzar la primer estructura repetitiva creamos el diccionario llamado agenda:

def cargar():
    agenda={}

El primer ciclo se repite mientras haya más fechas que cargar. Solicitamos que ingrese una fecha, creamos una lista para guardar todas las horas y actividades que hay par dicha fecha:

    continua1="s"
    while continua1=="s":
        fecha=input("ingrese la fecha con formato dd/mm/aa:")
        continua2="s"
        lista=[]

El segundo ciclo se repite mientras haya más actividades para el mismo día:

        while continua2=="s":
            hora=input("Ingrese la hora de la actividad con formato hh:mm ")
            actividad=input("Ingrese la descripcon de la actividad:")
            lista.append((hora,actividad))
            continua2=input("Ingresa otra actividad para la misma fecha[s/n]:")

Cuando se terminan de cargar todas las actividades para una determinada fecha se procede a insertar la lista en el diccionario:

        agenda[fecha]=lista
        continua1=input("Ingresa otra fecha[s/n]:")

Previo a salir de la función devolvemos la agenda ya cargada:

    return agenda

Para imprimir todas las fechas y actividades por fecha también disponemos dos ciclos repetitivos anidados, en este caso for in:

def imprimir(agenda):
    print("Listado completa de la agenda")
    for fecha in agenda:
        print("Para la fecha:",fecha)
        for hora,actividad in agenda[fecha]:
            print(hora,actividad)

De forma similar para consultar las actividades de la agenda una determinada fecha procedemos a ingresar la fecha y en el caso que haya una clave en el diccionario con ese dato procedemos a recuperar la lista de actividades para dicha fecha:

def consulta_fecha(agenda):
    fecha=input("Ingrese la fecha que desea consultar:")
    if fecha in agenda:
        for hora,actividad in agenda[fecha]:
            print(hora,actividad)
    else:
        print("No hay actividades agendadas para dicha fecha")

El bloque principal no difiere de problemas anteriores donde llamamos a las tres funciones que previamente definimos:

# bloque principal

agenda=cargar()
imprimir(agenda)
consulta_fecha(agenda)

Problema propuesto

  • Se desea almacenar los datos de 3 alumnos. Definir un diccionario cuya clave sea el número de documento del alumno. Como valor almacenar una lista con componentes de tipo tupla donde almacenamos nombre de materia y su nota.

    Crear las siguientes funciones:
    1) Carga de los alumnos (de cada alumno solicitar su dni y los nombres de las materias y sus notas)
    2) Listado de todos los alumnos con sus notas
    3) Consulta de un alumno por su dni, mostrar las materias que cursa y sus notas.

    Ver video

Solución
ejercicio165.py

def cargar():
    alumnos={}
    for x in range(3):
        dni=int(input("Ingrese el numero de dni:"))
        listamaterias=[]
        continua="s"
        while continua=="s":
            materia=input("Ingrese el nombre de materia que cursa:")
            nota=int(input("Ingrese la nota:"))
            listamaterias.append((materia,nota))
            continua=input("Desea cargar otra materia para dicho alumno [s/n}:")
        alumnos[dni]=listamaterias
    return alumnos


def listar(alumnos):
    for dni in alumnos:
        print("Dni del alumno",dni)
        print("Materias que cursa y notas")
        for nota,materia in alumnos[dni]:
            print(materia,nota)


def consulta_notas(alumnos):
    dni=int(input("Ingrese el dni a consultar:"))
    if dni in alumnos:
        for nota,materia in alumnos[dni]:
            print(materia,nota)


# bloque principal

alumnos=cargar()
listar(alumnos)
consulta_notas(alumnos)