Capitolo 11. Dizionari

Questo capitolo tratta i dizionari. I dizionari hanno chiavi e valori: le chiavi sono usate per trovare i valori. Ecco un esempio di un dizionario in uso:

def print_menu():
    print '1. Print Phone Numbers'
    print '2. Add a Phone Number'
    print '3. Remove a Phone Number'
    print '4. Lookup a Phone Number'
    print '5. Quit'
    print
numbers = {}
menu_choice = 0
print_menu()
while menu_choice != 5:
    menu_choice = input("Type in a number (1-5):")
    if menu_choice == 1:
        print "Telephone Numbers:"
        for x in numbers.keys():
            print "Name: ",x," \tNumber: ",numbers[x]
        print
    elif menu_choice == 2:
        print "Add Name and Number"
        name = raw_input("Name:")
        phone = raw_input("Number:")
        numbers[name] = phone
    elif menu_choice == 3:
        print "Remove Name and Number"
        name = raw_input("Name:")
        if numbers.has_key(name):
            del numbers[name]
        else:
            print name," was not found"
    elif menu_choice == 4:
        print "Lookup Number"
        name = raw_input("Name:")
        if numbers.has_key(name):
            print "The number is",numbers[name]
        else:
            print name," was not found"
    elif menu_choice != 5:
        print_menu()
Ecco l'output:
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Quit

Type in a number (1-5):2
Add Name and Number
Name:Joe
Number:545-4464
Type in a number (1-5):2
Add Name and Number
Name:Jill
Number:979-4654
Type in a number (1-5):2
Add Name and Number
Name:Fred
Number:132-9874
Type in a number (1-5):1
Telephone Numbers:
Name:  Fred     Number:  132-9874
Name:  Joe      Number:  545-4464
Name:  Jill     Number:  979-4654

Type in a number (1-5):4
Lookup Number
Name:Joe
The number is 545-4464
Type in a number (1-5):3
Remove Name and Number
Name:Fred
Type in a number (1-5):1
Telephone Numbers:
Name:  Joe      Number:  545-4464
Name:  Jill     Number:  979-4654

Type in a number (1-5):5
Questo programma simile a quello con la lista di nomi nel capitolo sulle liste. Ecco come funziona il programma. Innanzitutto viene definita la funzione print_menu che visualizza sullo schermo un menu pi volte usato nel programma. A questo punto compare la linea numbers = {} che dichiara numbers come un dizionario. Le linee seguenti fanno funzionare il menu:
for x in numbers.keys():
    print "Name: ",x," \tNumber: ",numbers[x]
Grazie a questo ciclo si possono visualizzare le informazioni contenute nel dizionario. La funzione number.keys() restituisce una lista che viene poi utilizzata dal ciclo for. Questa lista non in nessun ordine particolare quindi se la volete in ordine alfabetico essa deve essere ordinata. Con la notazione numbers[x] possiamo accedere ai singoli membri del dizionario: ovviamente in questo caso x una stringa. Successivamente la linea numbers[name] = phone aggiunge un nome e un numero di telefono al dizionario. Se name stato gi inserito nel dizionario phone, rimpiazza il valore precedente. Le linee:
if numbers.has_key(name):
    del numbers[name]
Controllano se una chiave gi presente nel dizionario, in tal caso la rimuovono. La funzione numbers.has_key(name) ritorna vero se name presente in numbers altrimenti ritorna falso. La linea del numbers[name] rimuove la chiave [name] e il valore ad essa associato. Le linee:
if numbers.has_key(name):
    print "The number is",numbers[name]
Controllano se nel dizionario presente una determinata chiave, se la trovano, stampano il numero ad essa associato. Infine se la scelta non presente nel menu (quindi non valida) il programma rivisualizza il menu.

Ricapitolando: i dizionari hanno chiavi e valori. Le chiavi possono essere stringhe o numeri e puntano a valori. I valori puntati possono essere qualsiasi tipo di variabile, anche liste di dizionari (i quali possono contenere a loro volta dizionari e liste (paura eh? :=) )). Questo un esempio che utilizza una lista in un dizionario:

max_points = [25,25,50,25,100]
assignments = ['hw ch 1','hw ch 2','quiz   ','hw ch 3','test']
students = {'#Max':max_points}

def print_menu():
    print "1. Add student"
    print "2. Remove student"
    print "3. Print grades"
    print "4. Record grade"
    print "5. Print Menu"
    print "6. Exit"


def print_all_grades():
        print '\t',
        for i in range(len(assignments)):
            print assignments[i],'\t',
        print
        keys = students.keys()
        keys.sort()
        for x in keys:
            print x,'\t',
            grades = students[x]
            print_grades(grades)


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



print_menu()
menu_choice = 0
while menu_choice != 6:
    print
    menu_choice = input("Menu Choice (1-6):")
    if menu_choice == 1:
        name = raw_input("Student to add:")
        students[name] = [0]*len(max_points)
    elif menu_choice == 2:
        name = raw_input("Student to remove:")
        if students.has_key(name):
            del students[name]
        else:
            print "Student: ",name," not found"
    elif menu_choice == 3:
        print_all_grades()

    elif menu_choice == 4:
        print "Record Grade"
        name = raw_input("Student:")
        if students.has_key(name):
            grades = students[name]
            print "Type in the number of the grade to record"
            print "Type a 0 (zero) to exit"
            for i in range(len(assignments)):
                print i+1,' ',assignments[i],'\t',
            print
            print_grades(grades)
            which = 1234
            while which != -1:
                which = input("Change which Grade:")
                which = which-1
                if 0 <= which < len(grades):
                    grade = input("Grade:")
                    grades[which] = grade
                elif which != -1:
                    print "Invalid Grade Number"
        else:
            print "Student not found"
    elif menu_choice != 6:
        print_menu()
E questo l'output:
1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit

Menu Choice (1-6):3
        hw ch 1         hw ch 2         quiz            hw ch 3         test
#Max    25              25              50              25              100


Menu Choice (1-6):1
1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit

Menu Choice (1-6):1
Student to add:Bill


Menu Choice (1-6):4
Record Grade
Student:Bill
Type in the number of the grade to record
Type a 0 (zero) to exit
1   hw ch 1     2   hw ch 2     3   quiz        4   hw ch 3     5   test
0               0               0               0               0
Change which Grade:1
Grade:25
Change which Grade:2
Grade:24
Change which Grade:3
Grade:45
Change which Grade:4
Grade:23
Change which Grade:5
Grade:95
Change which Grade:0


Menu Choice (1-6):3
        hw ch 1         hw ch 2         quiz            hw ch 3         test
#Max    25              25              50              25              100
Bill    25              24              45              23              95

Menu Choice (1-6):6
La variabile students un dizionario le cui chiavi sono i nomi degli studenti e i valori, i voti degli studenti. Le prime due linee creano semplicemente due liste. La linea successiva students = {'#Max':max_points} crea un nuovo dizionario la cui chiave #Max e il valore [25,25,50,25,100] ( il valore di max_points nel momento in cui il valore viene assegnato; viene usata la chiave #Max perch " # " sempre ordinato sopra i caratteri alfabetici). Quindi viene definita la funzione print_menu. Le linee:
def print_all_grades():
        print '\t',
        for i in range(len(assignments)):
            print assignments[i],'\t',
        print
        keys = students.keys()
        keys.sort()
        for x in keys:
            print x,'\t',
            grades = students[x]
            print_grades(grades)
definiscono la funzione print_all_grades.

Notate come le chiavi vengano innanzitutto estratte dal dizionario students con la funzione di keys contenuta nella linea: keys = students.keys() . keys una lista, quindi possono essere usate tutte le funzioni delle liste. Successivamente vengono ordinate le chiavi nella linea keys.sort() e viene utilizzato un ciclo for per scorrere tutte le chiavi. I voti sono immagazzinati come una lista all'interno del dizionario in modo che l'assegnamento grades = students[x] assegni a grades la lista immagazzinata nella chiave x. La funzione print_grades visualizza semplicemente una lista ed definita poche linee sotto.

Le ultime linee del programma implementano le varie opzioni del menu. La linea students[name] = [0] * len(max_points) aggiunge uno studente alla chiave corrispondente al nome. La notazione [0] * len(max_points) crea una array di '0' della stessa lunghezza della lista max_points.

La scelta "remove students" cancella uno studente in modo simile all'esempio precedente. La scelta "record grades" pi complessa. I voti vengono estratti nella linea grades = students[name] che ritorna un riferimento ai voti dello studente name. Un voto viene quindi registrato nella linea grades[wich] = grade. Notate che grades non viene inserito nel dizionario students. Il motivo di questa "mancanza" che grades semplicemente un altro nome per student[name] quindi cambiare grades significa cambiare student[name].