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].