Tapaaminen 11.02.2010

Aiheina:

  • sanakirja

Linkkejä:

Sanakirja

Sanakirja on kokoelmatietotyyppi, jonka tehtävänä on kuvata olioita toisiksi, siis palauttaa kutakin avainta vastaava arvo. Tyhjän listan voi luoda kaarisulkeilla:

>>> sanakirja = {}

Uusia avain-arvo-pareja sanakirjaan voi lisätä hakasuljemerkinnällä:

>>> sanakirja['one'] = 'yksi'
>>> sanakirja['two'] = 'kaksi'

Sanakirjasta hakeminen tapahtuu vastaavasti hakasulkeita käyttämällä:

>>> sanakirja['one']
'yksi'

Hakasulkeiden käyttö toimii siis vastaavasti kuin esimerkiksi listalla, mutta avaimena käytetään indeksiluvun sijasta avainta. Avain voi olla mitä tahansa avaimeksi soveltuvaa tyyppiä.

Uuden sanakirjan voi myös alustaa heti luonnin yhteydessä:

>>> sanakirja = {'one': 'yksi', 'two': 'kaksi'}

Operaatioita

Sanakirja tulostuu print-komennolla samassa muodossa, jossa sen voisi alustaakin.

>>> print sanakirja
{'one': 'yksi', 'two': 'kaksi'}

Avain-arvo-parin poisto sanakirjasta onnistuu del-komennolla.

>>> del sanakirja['two']
>>> print sanakirja
{'one': 'yksi'}

Sanakirjan jotain avainta vastaavan arvon muuttaminen tapahtuu aivan samoin kuin uuden avain-arvo-parin lisääminen.

>>> sanakirja['two'] = 'kolme'
>>> print sanakirja['two']
'kolme'
>>> sanakirja['two'] = 'kaksi'
>>> print sanakirja['two']
'kaksi'

Avain-arvo-parien lukumäärä sanakirjassa saadaan len()-funktiolla. Siis samalla funktiolla kuin merkkijonon, listan ja monikon pituudet.

>>> len(sanakirja)
2

Metodeja

Sanakirjalla on käytännöllisiä metodeja, joilla voidaan tarkastella sen sisältöä.

Listan sanakirjan avaimista saa keys()-metodilla.

>>> sanakirja.keys()
['two', 'one']

Vastaavasti listan arvoista saa values()-metodilla.

>>> sanakirja.values()
['kaksi', 'yksi']

Jos tarvitsemme listan avain-arvo-pareista (monikoista), se saadaan metodilla items().

>>> sanakirja.items()
[('two', 'kaksi'), ('one', 'yksi')]

Avaimen olemassaolon sanakirjassa voi tarkistaa metodilla has_key().

>>> sanakirja.has_key('one')
True
>>> sanakirja.has_key('three')
False

Metodi has_key() on tarpeellinen, sillä olemattomalla avaimella hakeminen tuottaa virheen.

>>> sanakirja['three']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'three'

Aliakset ja kopiot

Sanakirjan avaimen täytyy olla muuttumatonta tyyppiä, mutta sanakirja itse on muutettava. Tämän vuoksi sijoituslauseen kanssa tulee olla varovainen.

>>> alias = sanakirja

Aivan kuten listoilla, uusi muuttuja alias viittaa nyt samaan sanakirjaolioon kuin sanakirja. Koska nämä ovat nyt vain kaksi nimeä samalle oliolle, tähän sanakirjaolioon tehtävät muutokset näkyvät siis molemmissa. Jos tarvitsemme oikeasti kopion sanakirjasta, saamme sen copy()-metodilla.

>>> kopio = sanakirja.copy()
>>> kopio['two'] = 'viisi'
>>> print alias['two']
'kaksi'
>>> print kopio['two']
'viisi'

Harva matriisi

Sanakirja on käytännöllinen tilanteissa, joissa avainten määrä on suhteellisen pieni verrattuna mahdollisten avainten määrään. Eräs esimerkki tällaisesta on ns. harva matriisi, eli ruudukko, jossa suurimmassa osassa ruutuja on jokin oletusarvo ja vain muutamassa on jokin muu arvo. Listalla voidaan esimerkiksi esittää eräs harva matriisi seuraavasti:

matrix = [[0, 0, 0, 1, 0],
          [0, 0, 0, 0, 0],
          [0, 2, 0, 0, 0],
          [0, 0, 0, 0, 0],
          [0, 0, 0, 3, 0]]

Tässä käytetään suhteellisen paljon tilaa oletusarvon 0 tallentamiseen, vaikka kiinnostavia arvoja ovat nollasta poikkeavat arvot. Sama matriisi voidaan esittää sanakirjalla muodossa:

matrix = {(0, 3): 1, (2, 1): 2, (4, 3): 3}

Nyt nollasta poikkeavat arvot saadaan haettua matriisista hakemalla rivi-sarake-parilla.

>>> matrix[(0,3)]
1

Puutteena tässä esityksessäon se, että nollan sisältävillä rivi-sarake-pareilla tuloksena on virheilmoitus.

>>> matrix[(1,1)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: (1, 1)

Tämä voidaan kuitenkin kiertää sanakirjan get()-metodia, jolle voidaan antaa argumenttina oletusarvo, joka palautetaan, jos pyydettyä avainta ei löydy.

>>> matrix.get((1,1), 0)
0
>>> matrix.get((0,3), 0)
1
>>> matrix.get((2,1), 0)
2

Esimerkkejä sanakirjan käytöstä:

Harjoitustehtäviä

Kappale 12