next up previous contents
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 nombreya hubiera existido en el diccionario, el contenido de telefonoreemplazarí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.  


next up previous contents
Siguiente: Usando Modulos  Arriba: Tutor de Python para No-programadores Anterior: Expresiones Booleanas   Contenido
Josh Cogliati jjc@honors.montana.edu
Traducido por Victor M. Rosas-Garcia quimico69@yahoo.com