# més enllà de la "struct"

Diccionaris en Python

Al capítol d'estructures vas veure el dict fent de substitut lleuger d'una struct. Aquí és el protagonista: un mapa clau-valor de propòsit general, amb els seus propis patrons d'ús.

Per què un diccionari?

En una llista, trobar un element concret vol dir recórrer-la (potser sencera) comparant un per un. En un diccionari, accedir per clau és immediat: no cal recórrer res.

notes = {"Jordi": 8, "Anna": 9, "Marc": 6}

print(notes["Anna"])   # 9 — directe, sense cap bucle

Si això fos una llista de parelles (nom, nota), trobar la d'"Anna" voldria dir recórrer-la fins topar-hi. Amb un diccionari, la clau et porta directament al valor.

Crear, afegir i esborrar

persona = {"nom": "Jordi", "ciutat": "Barcelona"}

persona["edat"] = 16        # afegeix una clau nova
print("edat" in persona)    # True: comprova si hi és, sense llançar error

del persona["ciutat"]       # elimina una clau

L'operador in comprova si una clau existeix sense arriscar-te a cap error — equivalent, en esperit, a comprovar si una cerca en una llista ha donat resultat.

Recórrer un diccionari

MètodeDona
d.keys()totes les claus
d.values()tots els valors
d.items()parelles (clau, valor)
for nom, nota in notes.items():
    print(f"{nom}: {nota}")

El patró de comptar

Un dels usos més habituals d'un diccionari: comptar quantes vegades apareix cada cosa (lletres, paraules, respostes d'una enquesta...).

paraula = "programar"
comptador = {}

for lletra in paraula:
    if lletra in comptador:
        comptador[lletra] = comptador[lletra] + 1
    else:
        comptador[lletra] = 1

print(comptador)

Cada lletra és una clau; el seu comptatge, el valor. La primera vegada que apareix una lletra, cal crear-li l'entrada (amb 1); les següents, només incrementar-la.

get() amb valor per defecte

d.get(clau, valor_per_defecte) evita l'if ... else de més amunt: si la clau no hi és, retorna el valor per defecte en lloc de petar.

comptador = {}

for lletra in paraula:
    comptador[lletra] = comptador.get(lletra, 0) + 1

Exactament el mateix resultat que el bucle if/else d'abans, en una sola línia: comptador.get(lletra, 0) dona 0 si la lletra encara no hi és, o el seu comptatge actual si ja hi és.

Mira el diccionari créixer pas a pas

Fixa't en com el panell "Diccionari" va guanyant (o perdent) claus a mesura que el programa avança.

Diccionaris

Codi

Variables

NomValor

Diccionari

Terminal

Pas 1 / 1

Problemes per resoldre

Sense solució ni comprovació automàtica: escriu el programa, executa'l (python3 programa.py) i prova'l amb els exemples. Les pistes són plegades perquè les obris només si les necessites.

1. Agenda de contactes

Fes una agenda (diccionari buit) on cada clau és un nom i cada valor un telèfon. Demana'n uns quants i desa'ls; després, demana un nom i mostra el seu telèfon si hi és, o un avís si no hi és.

Nom a buscar: Anna
Telèfon: 600112233

Nom a buscar: Pere
No hi és a l'agenda
Pistes

Fes servir agenda.get(nom): si el nom no hi és, retorna None en lloc de petar — comprova-ho amb un if.

2. Comptar paraules d'una frase

Demana una frase i compta quantes vegades apareix cada paraula.

Frase: el gat i el gos i el ocell
el: 3
gat: 1
i: 2
gos: 1
ocell: 1
Pistes

frase.split() ja te la trenca en una llista de paraules (pels espais). A partir d'aquí, el mateix patró de comptar que has vist a la teoria.

3. Invertir un diccionari

Donat un diccionari on claus i valors són tots únics, crea'n un altre amb els papers bescanviats: cada valor passa a ser clau, i viceversa.

Original: {'Jordi': 8, 'Anna': 9, 'Marc': 6}
Invertit: {8: 'Jordi', 9: 'Anna', 6: 'Marc'}
Pistes

Comença amb un diccionari buit i, amb un bucle for clau, valor in original.items():, ves afegint nou[valor] = clau.

Un cop et surti amb el bucle, la versió idiomàtica en una línia és una comprensió de diccionari: {valor: clau for clau, valor in original.items()}.

Exercicis d'autoavaluació

Aquests es generen amb valors nous a l'atzar i tenen solució comprovable.

—

Quina serà la sortida per terminal d'aquest programa?