Sanakirjat

Sanakirjassa alkiot määritellään avain:arvo -pareina:

atomipainot = {"H":  1.008, "C": 12.011, "O": 15.999}

Tämän määrittelyn jälkeen avainta vastaavan arvon voi noutaa näin:

print("Hiilen atomipaino on", atomipainot["C"])

tulostaa

Hiilen atomipaino on 12.011

Määrittelyssä käytetään siis kaarisulkeita, mutta kun arvoihin viitataan avaimella, käytetään hakasulkeita.

Tyhjän sanakirjan luominen

uusi_sanakirja = {}

Arvojen lisääminen sanakirjaan

Arvojen lisääminen sanakirjaan on helppoa: annetaan vain uusi avain ja arvo:

# Luodaan tyhjä sanakirja ja lisätään kolme avain:arvo -paria
atomipainot = {}
atomipainot["H"] = 1.008
atomipainot["C"] = 12.011
atomipainot["O"] = 15.999
print(atomipainot)

Tulostaa

{'H': 1.008, 'C': 12.011, 'O': 15.999}

Sanakirjan voi myös määritellä ensin tiettyjen avain:arvo parien kanssa ja lisätä siihen myöhemmin lisää pareja:

atomipainot = {"H":  1.008, "C": 12.011, "O": 15.999}
atomipainot["P"] = 30.973
print(atomipainot)

tulostaa

{'H': 1.008, 'C': 12.011, 'O': 15.999, 'P': 30.973}

Python tulostaa sanakirjojen avaimet aina yksinkertaisia lainausmerkkejä käyttäen.

Arvon lisääminen sanakirjaan muuttujan avulla

Arvoja voi lisätä sanakirjaan myös käyttämällä avaimena olemassa olevan muuttujan sisältöä:

atomipainot = {"H":  1.008, "C": 12.011, "O": 15.999}
# Kysytään käyttäjältä uusi alkuaine ja atomipaino sanakirjaan
alkuaine = input("Anna alkuainesymboli\n")
atomipaino = float(input("Anna atomipaino\n"))
# alkuaine on nyt merkkijonomuuttuja, esimerkiksi "P"
# atomipaino on nyt liukuluku, esimerkiksi 30.973
atomipainot[alkuaine] = atomipaino
# Tulostetaan sanakirjan sisältö
print("Atomipainot:", atomipainot)

Esimerkkiajo:

Anna alkuainesymboli
> P
Anna atomipaino
> 30.973
Atomipainot: {'H': 1.008, 'C': 12.011, 'O': 15.999, 'P': 30.973}

Kurssin aikana käytämme lukuisia kertoja merkintää sanakirja[muuttuja] = arvo, kun haluamme lisätä avain:arvo-pareja sanakirjaan.

Arvon poimiminen sanakirjasta muuttujan avulla

Arvoja voi poimia sanakirjasta myös käyttämällä avaimena olemassa olevan muuttujan sisältöä:

atomipainot = {"H":  1.008, "C": 12.011, "O": 15.999}
# Kysytään käyttäjältä alkuaine
alkuaine = input("Anna alkuainesymboli, niin tulostan atomipainon:\n")
# alkuaine on nyt merkkijonomuuttuja, esimerkiksi "C"
print(atomipainot[alkuaine])

Esimerkkiajo:

Anna alkuainesymboli, niin tulostan atomipainon:
> C
12.011

Kurssin aikana käytämme lukuisia kertoja merkintää arvo = sanakirja[muuttuja], kun haluamme poimia tietyn arvon sanakirjasta.

Arvojen poistaminen sanakirjasta

Arvojen poistaminen sanakirjasta onnistuu del-avainsanalla:

atomipainot = {"H":  1.008, "C": 12.011, "O": 15.999}
del atomipainot["C"]
print(atomipainot)

tulostaa

{'H': 1.008, 'O': 15.999}

Avaimen olemassaolon tarkistaminen sanakirjasta 

in-avainsana toimii samaan tapaan kuin listojen kanssa:

# in-avainsanalla voi testata, onko avain sanakirjassa:
atomipainot = {"H":  1.008, "C": 12.011, "O": 15.999}
if "C" in atomipainot:
    print("Hiilen atomipaino on", atomipainot["C"])

tulostaa

Hiilen atomipaino on 12.011

Sanakirjan läpikäyminen, items()

Sanakirjan items()-funktio antaa arvot läpikäyntiä varten:

atomipainot = {"H":  1.008, "C": 12.011, "O": 15.999}
for alkuaine, atomipaino in atomipainot.items():
    print(f"Alkuaineen {alkuaine:s} atomipaino on {atomipaino:.3f} g/mol")

tulostaa

Alkuaineen H atomipaino on 1.008 g/mol
Alkuaineen C atomipaino on 12.011 g/mol
Alkuaineen O atomipaino on 15.999 g/mol

Yleinen muoto siis

for AVAIN, ARVO in SANAKIRJA.items():
    print(AVAIN, ARVO) # Silmukassa voimme käyttää avaimia ja arvoja kuten haluamme.

Sanakirjan lajitteleminen

sorted()-funktiolla voi tulostaa avaimet aakkosjärjestyksessä tai arvot järjestyksessä (sanakirjan values-funktio):

atomipainot = {"P": 30.973, "C": 12.011, "O": 15.999}
print(sorted(atomipainot))
print(sorted(atomipainot.values()))

tulostaa

['C', 'O', 'P']
[12.011, 15.999, 30.973]

Huomaa kuitenkin, että alkuperäisen sanakirjan (atomipainot) järjestys ei muutu, vaikka kutsuisit sorted-funktiota.

Huom! Ennen Pythonin versiota 3.6, sanakirjan avain:arvo parit olivat satunnaisessa järjestyksessä. Versiosta 3.6 eteenpäin ne ovat siinä järjestyksessä, missä ne on lisätty sanakirjaan.

Listat sanakirjojen sisällä

Sanakirjan arvot voivat olla vaikka listoja:

# Sanakirjan arvot voivat olla vaikka listoja:
yhdisteet = {"C2H6": ["C",  2,  "H", 6],
             "NaCl": ["Na", 1, "Cl", 1]
          # indeksi:   0    1    2   3
            }
print(yhdisteet["C2H6"])
print("Yhdisteessa C2H6 on", yhdisteet["C2H6"][3], "vetyatomia")

tulostaa

['C', 2, 'H', 6]
Yhdisteessa C2H6 on 6 vetyatomia

Tehtävä 3.6.1