Python 3 per a no programadors/Diccionaris
Aquest capítol tracta de diccionaris. Els diccionaris tenen claus i valors. Les claus es fan servir per trobar els valors. Aquí hi ha un exemple d'ús d'un diccionari:
def print_menu():
print('1. Print Números de telèfon')
print('2. Afegir un número de telèfon')
print('3. Eliminar un número de telèfon')
print('4. Cercar un número de telèfon')
print('5. Sortir')
print()
números = {}
elecció_menú = 0
print_menu()
while elecció_menú != 5:
elecció_menú = int(input("Teclegeu un número (1-5): "))
if elecció_menú == 1:
print("Números de telèfon:")
for x in números.keys():
print("Nom: ", x, "\tNúmero:", números[x])
print()
elif elecció_menú == 2:
print("Afegiu Nom i Número")
nom = input("Nom: ")
telèfon = input("Número: ")
números[nom] = telèfon
elif elecció_menú == 3:
print("Elimineu Nom i Número")
nom = input("Nom: ")
if nom in números:
del números[nom]
else:
print("No s'ha trobat", nom)
elif elecció_menú == 4:
print("Cercar Número")
nom = input("Nom: ")
if nom in números:
print("El número és", números[nom])
else:
print("No s'ha trobat", nom)
elif elecció_menú != 5:
print_menu()
I aquest és el resultat:
1. Print Números de telèfon 2. Afegir un número de telèfon 3. Eliminar un número de telèfon 4. Cercar un número de telèfon 5. Sortir Teclegeu un número (1-5): 2 Afegiu Nom i Número Nom: Marc Número: 545-4464 Teclegeu un número (1-5): 2 Afegiu Nom i Número Nom: Carles Número: 979-4654 Teclegeu un número (1-5): 2 Afegiu Nom i Número Nom: Jordi Número: 132-9874 Teclegeu un número (1-5): 1 Números de telèfon:: Nom: Carles Número: 979-4654 Nom: Marc Número: 545-4464 Nom: Jordi Número: 132-9874 Teclegeu un número (1-5): 4 Cercar Número Nom: Marc El número és 545-4464 Teclegeu un número (1-5): 3 Elimineu Nom i Número Nom: Jordi Teclegeu un número (1-5): 1 Números de telèfon: Nom: Carles Número: 979-4654 Nom: Marc Número: 545-4464 Teclegeu un número (1-5): 5
Aquest programa és similar a la llista de noms anterior en el capítol sobre llistes. Aquí hi ha com treballa el programa. Primer es defineix la funció print_menu. print_menu només escriu un menú que més tard es farà servir dues vegades en el programa. Després ve la línia amb aspecte divertit números = {}. Tot el que aquesta línia fa és dir a Python que números és un diccionari. Les següents línies només fan que el menú funcioni. Les línies
for x in números.keys():
print "Nom:", x, "\tNúmero:", números[x]
ressegueix el diccionari o escriu tota la informació. La funció números.keys() retorna una llista que llavors es fa servir pel bucle for. La llista retornada per keys() no està en cap ordre particular així que si es vol en ordre alfabètic s'ha d'ordenar. De forma similar al que es fa amb les llistes la expressió números[x] es fa servir per accedir a un membre específic del diccionari. Naturalment en aquest cas x és una cadena. La línia següent números[nom] = telèfon afegeix un número de telèfon i un nom al diccionari. Si nom ja esta al diccionari telèfon reemplaçaria qualsevol cosa era hi hagués abans. Les següents línies
if nom in números:
del números[nom]
comproven si un nom és al diccionari i el treuen si ho és. L'operador nom in números retorna true si nom és a números, si no retorna false. La línia del números[nom] elimina nom i el valor associat amb aquesta clau. Les línies
if nom in números:
print("El número és", números[nom])
comproven per veure si el diccionari té una clau determinada i si ho fa imprimeixen el número associat amb ella. Finalment, si l'opció del menú no és vàlida reimprimeix el menú.
Una recapitulació: els diccionaris tenen claus i valors. Les claus poden ser cadenes o números. Les claus apunten als valors. Els valors poden ser qualsevol tipus de variable (Incloses les llistes o diccionaris). Heus aquí un exemple de l'ús d'una llista en un diccionari:
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. Afegir Estudiant")
print("2. Esborrar Estudiant")
print("3. Imprimir Notes")
print("4. Enregistrar Nota")
print("5. Veure Menu")
print("6. Sortida")
def print_all_grades():
print('\t', end=' ')
for i in range(len(assignments)):
print(assignments[i], '\t', end=' ')
print()
keys = list(students.keys())
keys.sort()
for x in keys:
print(x, '\t', end=' ')
grades = students[x]
print_grades(grades)
def print_grades(grades):
for i in range(len(grades)):
print(grades[i], '\t', end=' ')
print()
print_menu()
menu_choice = 0
while menu_choice != 6:
print()
menu_choice = int(input("Escollir opció (1-6): "))
if menu_choice == 1:
name = input("Estudiant a afegir: ")
students[name] = [0] * len(max_points)
elif menu_choice == 2:
name = input("Estudiant a esborrar: ")
if name in students:
del students[name]
else:
print("Estudiant:", name, "no trobat")
elif menu_choice == 3:
print_all_grades()
elif menu_choice == 4:
print("Enregistrar Nota")
name = input("Estudiant: ")
if name in students:
grades = students[name]
print("Escriu la nota a enregistrar")
print("Type a 0 (zero) to exit")
for i in range(len(assignments)):
print(i + 1, assignments[i], '\t', end=' ')
print()
print_grades(grades)
which = 1234
while which != -1:
which = int(input("Canviar per la nota: "))
which -= 1 #vol dir el mateix que which = which - 1
if 0 <= which < len(grades):
grade = int(input("Nota: "))
grades[which] = grade
elif which != -1:
print("Nota invàlida")
else:
print("Estudiant no trobat")
elif menu_choice != 6:
print_menu()
I aquest n'és el resultat:
1. Afegir Estudiant
2. Esborrar Estudiant
3. Imprimir Notes
4. Enregistrar Nota
5. Veure Menu
6. Sortida
Escollir opció (1-6): 3
hw ch 1 hw ch 2 quiz hw ch 3 test
#Max 25 25 50 25 100
Escollir opció (1-6):
Escollir opció (1-6): 5
1. Afegir Estudiant
2. Esborrar Estudiant
3. Imprimir Notes
4. Enregistrar Nota
5. Veure Menu
6. Sortida
Escollir opció (1-6): 1
Estudiant a afegir: : Bill
Escollir opció (1-6): 4
Enregistrar Nota
Estudiant: : Bill
Escriu la nota a enregistrar
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
Canviar per la nota: 1
Nota: 25
Canviar per la nota: 2
Nota: 24
Canviar per la nota: 3
Nota: 45
Canviar per la nota: 4
Nota: 23
Canviar per la nota: 5
Nota: 95
Canviar per la nota: 0
Escollir opció (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
Escollir opció (1-6): 6
Així és com funciona el programa. Bàsicament, la variable students és
un diccionari on les claus són el nom dels estudiants i els valors són les seves notes. Les dues primeres línies creen dues llistes.
La següent línia students = {'#Max': max_points} crea un nou
diccionari amb la clau {#Max} i el valor es fixa per a ser [25, 25, 50, 25, 100] (Es fa servir la #Max des que # s'ordena
per davant de qualsevol caràcter alfabètic). Després print_menu és
definit. A continuació, la funció print_all_grades està definida en el
línies:
lines:
def print_all_grades():
print('\t',end=" ")
for i in range(len(assignments)):
print(assignments[i], '\t',end=" ")
print()
keys = list(students.keys())
keys.sort()
for x in keys:
print(x, '\t',end=' ')
grades = students[x]
print_grades(grades)
Observeu com primer les claus s'aconsegueixen del diccionari students amb la funció keys en la línia keys = list(students.keys()) . keys és un iteratiu, i es convertirà a llista per a totes les funcions per llistes que es poden utilitzar. A continuació les claus s'ordenen en la línia keys.sort(). for s'utilitza per passar per totes les claus. Els graus s'emmagatzemen com una llista dins del diccionari per a l'assignació grades = students[x] dóna grades de la llista que s'emmagatzemen en la clau x. La funció print_grades només imprimeix una llista i es defineix unes línies més endavant.
Les últimes línees del programa implementen les diferents opcions del menú. La línia students[name] = [0] * len(max_points) afegeix un estudiant a la clau del seu nom. La nota [0] * len(max_points) simplement crea una llista de 0's amb la mateixa llargada que la llista de max_points.
L'entrada per esborrar estudiants simplement esborra d'una manera similar a l'exemple de la guia telefònica. El registra de les notes és una mica més complex. Les qualificacions es gestionen en la línea grades = students[name], prenent com a referència l'estudiant mitjançant name. Llavors la nota es registra a la línia grades[which] = grade. Us podreu adonar que grades no s'inclou mai al diccionari dels estudiants (no als students[name] = grades). Això és degut al fet que grades es realiment un altre nom de students[name], i al canviar grades es canvia student[name].
Els diccionaris proporcionen una forma fàcil de vincular valors i claus. Això pot ser usat per mantenir fàcilment un registre de dades que s'adjunta a les diferents claus.