Keywords: easytut-it

Next: Usare i moduli Up: Tutorial per principianti in Previous: Espressioni booleane Indice

# 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()

E qui 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:  Jill     Number:  979-4654
    Name:  Joe      Number:  545-4464
    Name:  Fred     Number:  132-9874

    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:  Jill     Number:  979-4654
    Name:  Joe      Number:  545-4464

    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]

Tramite questo ciclo si possono visualizzare le informazioni contenute nel dizionario. La funzione `numbers.keys()` restituisce una lista che viene poi utilizzata dal ciclo `for`. Questa lista non ha un ordine particolare, quindi se la volete in ordine alfabetico la dovrete ordinare. Con la notazione `numbers[x]` potete accedere ai singoli membri del dizionario. Ovviamente in questo caso `x` è una stringa. Successivamente la linea `numbers[name] = phone` aggiunge un nome ed un numero di telefono al dizionario. Se `name` è stato già inserito nel dizionario `phone`, rimpiazza il valore precedente. Le linee successive:

    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 `del numbers[name]` rimuove la chiave `name` ed 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 visualizza nuovamente 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 (che 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 è il semplice 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):6
    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, i valori sono 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 seguenti definiscono `print_all_grades`.

    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)

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 zeri 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[which] = grade`. Notate che `grades` non viene inserito nel dizionario `students`. Il motivo di questa "mancanza" è che `grades` è semplicemente un altro nome per `students[name]` quindi cambiare `grades` significa cambiare `student[name]`.

I dizionari rappresentano un modo semplice per collegare chiavi a valori. Possono essere usati facilmente per tenere traccia dei dati che sono attribuiti alle varie chiavi.

Next: Usare i moduli Up: Tutorial per principianti in Previous: Espressioni booleane Indice