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.