Rečnici (Dictionary)

11.3 Rečnici (Dictionary) 

Sada ću ti pokazati jednu prilično moćnu strukturu podataka koja se zove rečnik. Rečnik možeš da zamisliš kao... čekaj da razmislim.... da – upravo kao rečnik, u kome postoji neka reč, a zatim sledi objašnjenje šta ta reč znači. Znači rečnik (predstavljen kao knjiga) je organizovan skup podataka, u kojem je povezivanje podataka izvršeno tako što se traži podatak koji je ključna reč, da bi se dobio drugi podatak koji ima neku vrednost, što je u primeru knjige koja je rečnik – objašnjenje te ključne reči. Da bi još bolje objasnio pojam rečnika, evo još jedna paralela sa realnim svetom - on je sličan adresaru, u kom možete naći adresu ili neke druge detalje tipa telefonskog broja, o nekoj osobi, naravno, podatke tražimo po imenu tražene osobe, odnosno, mi povezujemo ključnu reč (u primeru adresara je to ime ili prezime) sa vrednostima (što su detalji o toj osobi). A da bi ti tu stvar još pojasnio, zamisli listu – u njoj su predmeti poređani, i možemo ih metodom indeksiranja pronaći. Kada ih nalazimo, naša ključna reč je broj koji predstavlja njihovu poziciju u listi, a vrednost je sam taj objekat. E, vidiš, rečnici nam daju mogućnost, za razliku od lista, da ključna reč bude i nešto drugo, a ne samo broj, već recimo, string koji predstavlja nečije ime.
Budući da se pretraga podataka vrši putem te ključne reči tj ključa (jer ne mora da bude reč, već može biti i broj, tuple i sl), upali bi smo u problem ako bi vrednost ključa bila neki promenljiv tip podataka. Iz toga sledi da ključ mora biti jedinstven – u primeru adresara kako ćeš znati koja je tačna informacija ako u njemu postoje dve osobe kojima si dodelio totalno isto ime i prezime? Jedino da pogađaš, pa na sreću. U programiranju nema pogađanja, ne očekuj da Python bude ambiciozan kao što si ti, niti da će on izvršiti neki svoj izbor – to je tvoj posao da mu sročiš šta želiš. 
Iz ovoga dalje sledi važna činjenica koju moraš zapamtiti - ti možeš da koristiš samo nepromenljive objekte (kao što su stringovi, ili tuple) kao ključeve u rečnicima, ali vrednosti u rečnicima mogu da budu bilo kakvi objekti iz tvog programa!
Sada kada znaš šta je rečnik, red bi bio i da vidiš kako on izgleda. Evo, rečnik se definiše ovako:
moj_rečnik = {prvi_ključ : prva_vrednost, drugi_ključ : druga_vrednost}
Komplikovanije rečeno, parovi ključ - vrednost se definišu tako što ih stavimo u vitičaste zagrade, par ključ - vrednost razdvajamo oznakom dvotačka (znači dvotačka je ono što razdvaja ključ od vrednosti), a ako imamo više ovakvih parova, mi ih međusobno odvajamo sa zarezima. 
Rečnik je neorganizovan skup podataka, to jest, ne postoji neki redosled po kojem su ključevi i njima odgovarajuće vrednosti organizovani, i to treba da zapamtiš, jednostavno parovi ključ - vrednost unutar nekog rečnika nisu sortirani ni na koji način. Zato ako želiš da obrađuješ stvari koje se nalaze unutar njega u nekom određenom poretku, moraćeš te stvari da sortiraš pre nego što ih proslediš na dalju obradu. 
Za naše rečnike zadužena je dict klasa:
>>> a = {} 
>>> type(a) 
<class 'dict'> 
>>> 
Upravo sam definisao prazan rečnik i utvrdio da je on objekat klase koja se zove dict.
Ali, hajde da uradimo neki primer – hajde da napravimo rečnik kompjuterskih termina.
Mi ćemo kreirati rečnik termini a zatim ću ti pokazati kako da pristupiš parovima ključ – vrednost, tako što navodimo ključ u operaciji indeksiranja, koju sam ti objasnio u primerima sa listama i tupleima. Vidi kako je sve to jednostavno.
>>> termini = { 
... 'hardver' : 'fizička komponenta računara', 
... 'program' : 'skup zadatih naredbi računaru koje rade neki posao umesto nas',... 'python'  : 'programski jezik koji upravo učim', 
... 'pare'    : 'to ne postoji' 
... } 
>>> print('Pare - ', termini['pare']) 
Pare -  to ne postoji 
>>> print('Hardver - ', termini['hardver']) 
Hardver -  fizička komponenta računara 
>>> 
Uh, definicija para ne pripada rečniku kompjuterskih termina, zar ne? Budući da su rečnici promenljivi tip podataka mi možemo obrisati neželjeni par ključ – vrednost tako što koristimo već poznatu del komandu.
>>> del termini['pare'] 
>>> termini 
{'python': 'programski jezik koji upravo učim', 'hardver': 'fizička komponenta računara', 'program': 'skup zadatih naredbi računaru koje rade neki posao umesto nas'} 
>>> 
Ja sam i u ovom slučaju jednostavno koristio operaciju indeksiranja – naveo sam ime rečnika i u operator prosledio ključ čiju vrednost želim da uklonim. Kada na kraju prikažem rečnik, vidim da u njemu ne postoji više niti ključ 'pare' niti odgovarajuća vrednost.
Funkcija len() se može koristiti i sa rečnicima – vratiće nam ukupan broj parova koji se nalaze u njemu:
>>> len(termini) 
3 
>>> 
Rečnici imaju par korisnih metoda, a jedna od njih je items(). Metoda items() je generator, kao i funkcija range(), i ona će da nam vraća jednu tuplu u jednom trenu, a ta tupla će da bude sačinjena od dve stavke -prva je ključ, a druga je odgovarajuća vrednosti. Ova metoda je korisna za sortiranje, pretragu ili prikaz sadržine rečnika. Ja ću da koristim za prikaz:
>>> for izraz, značenje in termini.items(): 
...     print('Termin', izraz, 'znači', značenje) 
... 
Termin python znači programski jezik koji upravo učim 
Termin hardver znači fizička komponenta računara 
Termin program znači skup zadatih naredbi računaru koje rade neki posao umesto nas 
>>> 
Obrati pažnju šta sam uradio u for petlji. Ja znam da će mi metoda items() vratiti tuplu koja sadrži dve stvari i zbog toga ja koristim dve promenljive (sa imenima izraz i značenje) kako bih im dodeljivao vrednosti iz tuple. Ovo je veoma česta operacija, i naziva se otpakivanje tupli. Veoma je korisna u mnogim, mnogim slučajevima – a naročito zgodna je sama pomisao na to da mi, ovim činom, dodeljujemo vrednost u istom trenu više promenljivima, pa ne moramo da trošimo prste na kucanje komandi u više redova i sl.
Za razliku od lista, u koje, ako želimo da dodamo neki objekat, moramo da koristimo posebne metode, ili tuplea, u koje ni nemožemo da dodajemo objekte, rečnici su super laki – mi možemo da u njih dodajemo nove parove ključeva – vrednosti, jednostavno - koristeći operator indeksiranja:
>>> termini['monitor'] = 'izlazni uređaj koji služi za prikaz rezultata obrade podataka' 
>>> termini 
{'python': 'programski jezik koji upravo učim', 'hardver': 'fizička komponenta računara', 'program': 'skup zadatih naredbi računaru koje rade neki posao umesto nas', 'monitor': 'izlazni uređaj koji služi za prikaz rezultata obrade podataka'} 
>>> 
Jednostavno, zar ne? Nema nikakve komplikacije! Jednostavno, osmislimo neki ključ, koji prosledimo kao indeks rečnika i tome dodelimo neku vrednost. Obrati pažnju – ukoliko ključ već postoji u našem rečniku, mi ćemo mu obrisati staru vrednost i dodeliti novu! Da ne bi smo „presnimili“ neku, možda važnu, vrednost, uvek je bolje da prvo proverimo da li već postoji taj ključ u rečniku. Za to nam služi naredba in:
>>> if 'gramofon' not in termini: 
...     termini['gramofon'] = 'šta će ovo u kompjuterskim terminima?' 
... 
>>> for izraz, značenje in termini.items():...     print('Termin', izraz, 'znači', značenje)... 
Termin monitor znači izlazni uređaj koji služi za prikaz rezultata obrade podataka 
Termin python znači programski jezik koji upravo učim 
Termin hardver znači fizička komponenta računara 
Termin gramofon znači šta će ovo u kompjuterskim terminima? 
Termin program znači skup zadatih naredbi računaru koje rade neki posao umesto nas 
>>> 
Ako te zanimaju metode koje možeš koristiti pri radu sa rečnicima pogledaj:
help(dict) 

11.2 Tuple Indeks 11.4 Sekvence

Primjedbe

Popularno ovog meseca

Gde pronaći novosti sa facebook stranica nakon velike promene koja ga je zadesila?

Dva načina da vratite svoj Windows 10 na fabričke vrednosti

Kako preuzeti video koji je neko postavio na facebook-u bez upotrebe dodatnih programa?

Više neće biti moguć besplatan prelazak na Windows 10

Prijateljski meč ŠK "Titel" - ŠK "Bukovac"

Kako manipulisati Windows licencom pomoću slmgr komande?

Tu je novi Qt creator 4.4.0!

Fake poet

Da li je poželjno biti anoniman na internetu (ili se predstavljati punim imenom i prezimenom)?

Kosmička era može da počne! 10, 9, 8, 7.... Naravno, pre 60 godina...