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.