Python


Slovarji

Slovarji (dictionaries) so podatkovni tipi podobno kot seznami (lists) z razliko, da naslavljajo vsebino s poljubnimi vrednostmi, ne pa z zaporedno številko, kar je značilno za sezname.

Spomnimo se seznamov. Seznam si lahko predstavljamo kot preslikavo množice števil na množico vrednosti. Vzemimo primer seznama z naslednjimi vrednostmi:

    "rdec"
"zelen"
"moder"

Tedaj je seznam preslikava števil 0,1,2 v te vrednosti

    0 --> "rdec"
1 --> "zelen"
2 --> "moder"

Slovarji so bolj splošna oblika tega koncepta. Slovar preslikava množico ključev v množico vrednosti. V Pythonu izgleda to tako:

    { "ime" : "Janez Novak" ,
"starost" : 25,
"telefon" : "555-6666",
"naslov" : "Povsetova 138",
"mesto" : "Ljubljana",
"drzava" : "Slovenija",
"zip" : "1000" }

Ta slovar preslikava ključe (na levi) v vrednosti (na desni):

    "ime"    --> "Janez Novak"
"starost" --> 25
"telefon" --> "555-6666"
"ulica" --> "Povsetova 138"
"mesto" --> "Ljubljana"
"drzava" --> "Slovenija"
"zip" --> "1000"

Slovarje uporabljamo podobno kot sezname.

    naslov =  { "ime" : "Janez Novak","mesto" : "Ljubljana", "naslov" : "Povsetova 138"}
print naslov["ime"] #izpise "Janez Novak"
print naslov["mesto"] #izpise "Ljubljana"
print udelezenec["ulica] #izpise "Povsetova 138"
naslov["ulica"] = "Dolenjska cesta 5"
print naslov["ulica"] #izpise "Dolenjska cesta 5"

V slovar lahko vnašamo nove vrednosti:

    naslov["zip"] = "2000"

Slovarji so pripraven način za sledenje objektom, ki imajo imenovane atribute (lastnosti), tako kot ljudje oziroma naslovi v zgornjih primerih. Lahko bi sicer uporabljali kar seznam za sledenje istim podatkom, kot na primer

        naslov =  ["Povsetova 138", "Ljubljana", "Slovenija"]

vendar bi morali paziti, kateri atribut je bil dodeljen v kateri oštevilčeni "predalček" seznama. Uporaba slovarja zmanjša možnost človeške napake in tudi sicer olajša delo programerju.

Slovarji nudijo vrsto metod za rokovanje z njihovo vsebino. Metode so v bistvu funkcije, "prilepljene" na posamezen slovar. Seznam teh funkcij najdeš v spletnem priročniku Library Reference. Metode uporabljamo na enak način, kot na primer uporabljamo  metodo "append" na seznamu ali  metodo "read" na datoteki. Metoda "append" je ena od metod seznamov (lists), metoda  "read" ena od metod datotek (files). Če torej hočemo uporabiti slovarjevo metodo "keys" , bi morali napisati nekaj takega

    kljuci = naslov.keys()
for kljuc in kljuci:
print "Kljucu", kljuc, "slovarja ustreza atribut", naslov[kljuc]

Naš program z imeni bi lahko dopolnili tako, da bi o vsakem posamezniku pomnili še druge podatke, ne le njegovo ime (tudi  naslov, morda e-mail naslov itd). Namesto imen posameznikov  bi v seznamu morali pomniti slovarje (torej celotno skupino podatkov o posameznikih). Kako bi morali predelati funkciji   "dodajIme" in "izpisOseb" , prikazuje naslednja koda:

    def dodajIme( seznam ):
novaOseba = {}
print "Vpisi ime osebe"
novaOseba["ime"] = raw_input()
print "Vpisi ulico osebe", novaOseba["ime"]
novaOseba["ulica"] = raw_input()
print "Vnesi mesto osebe", novaOseba["ime"]
novaOseba["mesto"] = raw_input()
print "Vnesi drzavo osebe", novaOseba["ime"]
novaOseba["drzava"] = raw_input()
print "Vnesi postno stevilko osebe", novaOseba["oseba"]
novaOseba["zip"] = raw_input()
seznam.append(novaOseba)

def izpisOseb( seznam ):
for oseba in seznam:
print oseba["ime"]
print oseba["ulica"]
print oseba["mesto"], ",", oseba["drzava"], oseba["zip"]
print

Težave se pojavijo, ko bi hoteli program tako spremeniti, da bi  seznam slovarjev pomnili na datoteko in  nato tak seznam slovarjev spet brali nazaj (doslej smo pomnili in brali le seznam imen, torej seznam nizov). Z dosedanjim znanjem bi to izvedli precej neelegantno. Nadaljevanje bo dalo pravi odgovor.