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ètode | Dona |
|---|---|
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
| Nom | Valor |
|---|
Diccionari
Terminal
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?