Keywords: easytut

Siguiente: Usando Modulos Arriba: Tutor de Python para No-programadores Anterior: Expresiones Booleanas Contenido

# Diccionarios

Este capítulo es acerca de diccionarios. Los diccionarios tienen claves y valores. Las claves se usan para encontrar los valores. Este es un ejemplo de un diccionario en acción:

    def imprimir_menu():
        print '1. Imprimir numeros telefonicos'
        print '2. Agregar un numero telefonico'
        print '3. Borrar un numero telefonico'
        print '4. Buscar un numero telefonico'
        print '5. Cerrar el programa'
        print
    numeros = {}
    seleccion_menu = 0
    imprimir_menu()
    while seleccion_menu != 5:
        seleccion_menu = input("Escriba un numero (1-5):")
        if seleccion_menu == 1:
            print "Numeros Telefonicos:"
            for x in numeros.keys():
                print "Nombre: ",x," \tNumero: ",numeros[x]
            print
        elif seleccion_menu == 2:
            print "Agregar nombre y numero"
            nombre = raw_input("Nombre:")
            telefono = raw_input("Numero:")
            numeros[nombre] = telefono
        elif seleccion_menu == 3:
            print "Borrar nombre y numero"
            nombre = raw_input("Nombre:")
            if numeros.has_key(nombre):
                del numeros[nombre]
            else:
                print "No pude encontrar a ", nombre
        elif seleccion_menu == 4:
            print "Buscar numero"
            nombre = raw_input("Nombre:")
            if numeros.has_key(nombre):
                print "El numero es",numeros[nombre]
            else:
                print "No pude encontrar a ",nombre
        elif seleccion_menu != 5:
            imprimir_menu()

Y esta es la salida:

    1. Imprimir numeros telefonicos
    2. Agregar un numero telefonico
    3. Borrar un numero telefonico
    4. Buscar un numero telefonico
    5. Cerrar el programa

    Escriba un numero (1-5):2
    Agregar nombre y numero
    Nombre:Joe
    Numero:545-4464
    Escriba un numero (1-5):2
    Agregar nombre y numero
    Nombre:Jill
    Numero:979-4654
    Type in a number (1-5):2
    Agregar nombre y numero
    Nombre:Fred
    Numero:132-9874
    Escriba un numero (1-5):1
    Numeros telefonicos:
    Nombre:  Jill     Numero:  979-4654
    Nombre:  Joe      Numero:  545-4464
    Nombre:  Fred     Numero:  132-9874

    Escriba un numero (1-5):4
    Buscar numero
    Nombre:Joe
    El numero es 545-4464
    Escriba un numero (1-5):3
    Borrar nombre y numero
    Nombre:Fred
    Escriba un numero (1-5):1
    Numeros telefonicos:
    Nombre:  Jill     Numero:  979-4654
    Nombre:  Joe      Numero:  545-4464

    Escriba un numero (1-5):5

El programa es similar al anterior de la lista de nombres, que vimos en el capítulo de listas. El programa funciona del modo siguiente: Primero, definimos la función `imprimir_menu`. `imprimir_menu` solamente imprime un menu que luego usamos dos veces en el programa. Luego viene el renglón de apariencia extraña `numeros = {}`. Todo lo que ese renglón hace es decirle a Python que `numeros` es un diccionario. Los siguientes renglones hacen que el menú funcione. Los renglones:

    for x in numeros.keys():
        print "Nombre: ",x," \tNumero: ",numeros[x]

recorren el diccionario e imprimen toda la información. La función `numeros.keys()` devuelve una lista empleada por el rizo `for`. La lista devuelta por `keys` no esta ordenada así que si desea orden alfabético debe ordenarla. De modo parecido a las listas, la declaración `numeros[x]` se usa para obtener un miembro específico del diccionario. Claro que en este caso `x` es una hilera. A continuación, el renglón `numeros[nombre] = telefono` agrega un nombre y un número de teléfono al diccionario. Si `nombre`ya hubiera existido en el diccionario, el contenido de `telefono`reemplazaría el valor anterior. Luego los renglones:

    if numeros.has_key(nombre):
        del numeros[nombre]

ven si un nombre en particular está en el diccionario y lo borran si así era. La función `numeros.has_key(nombre)` devuelve verdadero si la clave `nombre` existe en el diccionario `numeros` o devuelve falso si no es así. El rengló `del numeros[nombre]` borra la clave `nombre` y el valor asociado con esa clave. Los renglones:

    if numeros.has_key(nombre):
        print "El numero es",numeros[nombre]

revisa si el diccionario posee una clave en particular y, si dicha clave existe, entonces imprime el número telefónico asociado con dicha clave. Por último, si la selección del menú no es válida, imprime de nuevo el menú para que usted se divierta.

Revisión rápida: Los diccionarios tienen claves y valores. Las claves pueden ser hileras o números. Las claves apuntan hacia los valores. Los valores pueden se cualquier tipo de variable (incluyendo listas o hasta diccionarios (esos diccionarios o listas también pueden contener diccionarios o listas dentro de ellos (qué miedo ¿verdad? :) )). Este es un ejemplo de un diccionario que contiene una lista:

    puntos_max = [25,25,50,25,100]
    asignaciones = ['tarea cap 1','tarea cap 2','examen   ','tarea cap 3','prueba']
    estudiantes = {'#Max':puntos_max}

    def imprimir_menu():
        print "1. Agregar un estudiante"
        print "2. Borrar un estudiante"
        print "3. Imprimir calificaciones"
        print "4. Registrar calificacion"
        print "5. Imprimir menu"
        print "6. Cerrar el programa"

    def imprimir_todas_califs():
            print '\t',
            for i in range(len(asignaciones)):
                print asignaciones[i],'\t',
            print
            claves = estudiantes.keys()
            claves.sort()
            for x in claves:
                print x,'\t',
                calificaciones = estudiantes[x]
                imprimir_califs(calificaciones)

    def imprimir_califs(calificaciones):
        for i in range(len(calificaciones)):
            print calificaciones[i],'\t\t',
        print

    imprimir_menu()
    seleccion_menu = 0
    while seleccion_menu != 6:
        print
        seleccion_menu = input("Elija una opcion del menu (1-6):")
        if seleccion_menu == 1:
            nombre = raw_input("Agregar al estudiante:")
            estudiantes[nombre] = [0]*len(puntos_max)
        elif seleccion_menu == 2:
            nombre = raw_input("Borrar al estudiante:")
            if estudiantes.has_key(nombre):
                del estudiantes[nombre]
            else:
                print "El estudiante: ",nombre," no esta en el diccionario"
        elif seleccion_menu == 3:
            imprimir_todas_califs()

        elif seleccion_menu == 4:
            print "Registro de calificacion"
            nombre = raw_input("Estudiante:")
            if estudiantes.has_key(nombre):
                calificaciones = estudiantes[nombre]
                print "Escriba el la calificacion para registrar"
                print "Escriba 0 (cero) para salir"
                for i in range(len(asignaciones)):
                    print i+1,' ',asignaciones[i],'\t',
                print
                imprimir_califs(calificaciones)
                cual = 1234
                while cual != -1:
                    cual = input("Cual calificacion quiere cambiar:")
                    cual = cual-1
                    if 0 <= cual < len(calificaciones):
                        calificacion = input("Calificacion:")
                        calificaciones[cual] = calificacion
                    elif cual != -1:
                        print "Calificacion no valida"
            else:
                print "No encontre a ese estudiante"
        elif seleccion_menu != 6:
            imprimir_menu()

y esta es una muestra de la salida:

    1. Agregar un estudiante
    2. Borrar un estudiante
    3. Imprimir calificaciones
    4. Registrar calificacion
    5. Imprimir menu
    6. Cerrar el programa

    Elija una opcion del menu (1-6):3
    	tarea cap 1 	tarea cap 2 	examen    	tarea cap 3 	prueba
    #Max 	25 		25 		50 		25 		100

    Elija una opcion del menu:6

    1. Agregar un estudiante
    2. Borrar un estudiante
    3. Imprimir calificaciones
    4. Registrar calificacion
    5. Imprimir menu
    6. Cerrar el programa

    Elija una opcion del menu:1
    Agregar al estudiante:Bill

    Elija una opcion del menu:4
    Registro de calificacion
    Estudiante:Bill
    Escriba el la calificacion para registrar
    Escriba 0 (cero) para salir
    1   tarea cap 1 	2   tarea cap 2 	3   examen    	4   tarea cap 3      5   prueba
    0 		0 		0 		0 		0
    Cual calificacion quiere cambiar:1
    Calificacion:25
    Cual calificacion quiere cambiar:2
    Calificacion:24
    Cual calificacion quiere cambiar:3
    Calificacion:45
    Cual calificacion quiere cambiar:5
    Calificacion:95
    Cual calificacion quiere cambiar:0

    Elija una opcion del menu (1-6):3
    	tarea cap 1 	tarea cap 2 	examen    	tarea cap 3 	prueba
    #Max 	25 		25 		50 		25 		100
    Bill 	25 		24 		45 		0 		95

    Elija una opcion del menu (1-6):

El programa funciona de la siguiente manera. Básicamente, la variable `estudiantes` es un diccionario en el cual los nombres de los estudiantes sirven de claves y las calificaciones son los valores asociados a las claves. Los dos primeros renglones crean dos listas. El siguiente renglón `estudiantes = {'#Max':puntos_max}` crea un nuevo diccionario con la clave `#Max` y el valor asociado como `[25,25,50,25,100]` (dado que ese era el contenido de `puntos_max` cuando fue efectuada la declaración) (Uso la clave `#Max` porque el símbolo `#` tiene precedencia alfabética sobre todos los demás caracteres alfabéticos). Luego definimos `imprimir_menu`. A continuación definimos la función `imprimir_todas_califs` en los renglones:

    def imprimir_todas_califs():
            print '\t',
            for i in range(len(asignaciones)):
                print asignaciones[i],'\t',
            print
            claves = estudiantes.keys()
            claves.sort()
            for x in claves:
                print x,'\t',
                calificaciones = estudiantes[x]
                imprimir_califs(calificaciones)

Observer cómo obtenemos primero las claves del diccionario `estudiantes` con la función `keys` en el renglón `claves = estudiantes.keys()` . `claves` es una lista, así que le podemos aplicar todas las funciones propias de las listas. Luego ordenamos las claves con la función `claves.sort()` ya que `claves` es una lista. `for` se usa para recorrer todas las claves. Las calificaciones quedan guardadas como una lista dentro de un diccionario, de modo que la asignación `calificaciones = estudiantes[x]` le da a la variable `calificaciones` la lista que está guardada en la clave `x`. La función `imprimir_califs` solamente imprime una lista y es definica unos cuantos renglones después.

Los renglones posteriores del programa instrumentan las varias opciones del menú. El renglón `estudiantes[nombre] = [0]*len(puntos_max)` agrega un estudiante a la clave de su nombre. La notación `[0]*len(puntos_max)` sólo crea un arreglo de ceros de la misma longitud que la lista `puntos_max`.

La opción para borrar un estudiante, borra un estudiante de modo similar al ejemplo del directorio telefonico. La opción para registrar calificaciones es un poco más complicada. En el renglón `calificaciones = estudiantes[nombre]` la variable `calificaciones` obtiene una referencia a las calificaciones del estudiante de nombre `nombre`. El registro de una calificación es efectuado en el renglón `calificaciones[cual] = calificacion`. Tal vez se haya fijado que el valor `calificaciones` nunca es asignado al diccionario de estudiantes (como sería el caso de `estudiantes[nombre] = calificaciones`). La razón por la que no hacemos eso es que `calificaciones` es de hecho otro nombre para `estudiantes[nombre]` y por eso, el simple hecho de cambiar `calificaciones` cambia `estudiante[nombre]`.

Los diccionarios proporcionan un modo fácil de asociar claves y valores. Esto puede usarse para seguir fácilmente el rastro de datos que están asociados a varias claves.

Siguiente: Usando Modulos Arriba: Tutor de Python para No-programadores Anterior: Expresiones Booleanas Contenido
Traducido por Victor M. Rosas-Garcia quimico69@yahoo.com