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:
Ecco l'output:
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()
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:
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
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:
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
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):
del 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.
if numbers.has_key(name):
print "The number is",numbers[name]
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:
E questo è l'output:
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()
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:
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
definiscono la funzione
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 '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].