Rječnik (Dictionary)

Dictionary (rječnik) je tip podataka sličan polju, samo što index nije isključivo cjeli broj nego bilo koji immutable tip podataka kao što su stringovi ili brojevi. To znači da su dopušteni izrazi a['rezultat'] = a['prvi pribrojnik'] + a['drugi pribrojnik'] ili a['rezultat'] = a[('pribrojnik',1)] + a[('pribrojnik',2)], za razliku od polja gdje je elementima moguće pristupiti samo pomoću brojčanog indeksa: a[2] = a[0] + a[1].

Kreiranje

dana = dict()   #ili dana = {}
dana['siječanj'] = 31
dana[2] = 28
print(dana)
print(dana[2])
print(dana['siječanj'])
{'siječanj': 31, 2: 28}
28
31
dana = dict(sijecanj=31, mj2=28)
print(dana)
print(dana['mj2'])
print(dana['sijecanj'])
{'sijecanj': 31, 'mj2': 28}
28
31
dana = {1:"trideset jedan", "2":28}
print(dana)
print(dana["2"])
print(dana[1])
{1: 'trideset jedan', '2': 28}
28
trideset jedan

Očitavanje i mijenjanje

>>> dana = dict(sijecanj=31, mj2=28)
>>> print(dana)
{'sijecanj': 31, 'mj2': 28}
>>> print(dana['mj2'])
28
>>> print(dana['sijecanj'])
31
>>> print(list(dana.keys()))
['sijecanj', 'mj2']
>>> print(list(dana.values()))
[31, 28]
>>> print(list(dana.items()))
[('sijecanj', 31), ('mj2', 28)]
dana = dict(sijecanj=31, mj2=28)
dana.update({
  'veljača':28,
  'travanj':30})
dana['ožujak'] = 31
for k in list(dana.keys()):
  print(k, dana[k])
sijecanj 31
mj2 28
veljača 28
travanj 30
ožujak 31
dana = {'siječanj':"trideset jedan", 2:28}
print('siječanj' in dana)
print('svibanj' in dana)
True
False

Primjer: brojanje ponavljanja riječi u listi

L = ["kruška","jabuka","jabuka","limun","kruška","kruška"]
brojac = {}
for i in L:
  if i in brojac:
    brojac[i] += 1
  else:
    brojac[i] = 1

for k in brojac:
  print(k, brojac[k])
kruška 3
jabuka 2
limun 1

U gornjem primjeru smo pazili da ne pokušamo očitati vrijednost brojac[i] ako ključ i već nije u rječniku brojac. Da bi se ta provjera izbjegla, moguće je zadati default vrijednosti nekom rječniku koristeći funkciju dict.setdefault() ili klasu collections.defaultdict:

from collections import defaultdict

dana = defaultdict( lambda: 31 )
dana["veljača"]=28
dana["travanj"]=30
L = ["siječanj", "veljača", "ožujak", "travanj", "bilo što"]
for i in L:
  print(i, dana[i])
siječanj 31
veljača 28
ožujak 31
travanj 30
bilo što 31

Brojanje riječi se, prema tome, može riješiti i ovako:

from collections import defaultdict

L = ["kruška","jabuka","jabuka","limun","kruška","kruška"]
brojac = defaultdict( lambda: 0 )
for i in L:
  brojac[i] += 1

for k in brojac:
  print(k, brojac[k])
kruška 3
jabuka 2
limun 1

Dodatni primjeri na https://docs.python.org/3/library/collections.html#defaultdict-examples.