Da li je ovo tvoje resenje ili je to prepisano iz knjige? Zadatak je postavljen prilicno nejasno. Da li se trazi englesko-srpski recnik ili obrnuto? Recnik koji si postavio online podrazumeva da su reci s leve strane srpske, s desne engleske, a onda autor resenja pravi recnik (odnosno 'dict' strukturu) u kome su stvari postavljene obrnuto - kljucevi su engleske reci, a vrednosti srpske. Da bi na kraju program za zadate srpske reci vracao engleske ... prilicno konfuzno, ako mene pitas.
Ako ti vec treba srpsko-engleski recnik, zar nije prirodnije definisati dict u stilu:
srEn = { 'a' : 'but, and', 'abonos' : 'ebony', 'avaj' : 'oh', 'avgust' : 'August', 'avet' : 'ghost, phantom', 'avetinja' : 'ghost, phantom', 'avlija' : 'court, court-yard' ... }
u kom slucaju funkcija pretraga postaje krajnje jednostavna:
def pretraga (data, key):
if (key in data):
return data[key]
else:
return ''
Ova funkcija gore podrazumeva da je recnik konstruisan u strogom 1:1 maniru. Medjutim, ovaj tvoj nije. Ima slucajeva kada se iste engleske reci mapiraju u vise srpskih reci i obrnuto:
'agent' : 'agent'
'agent' : 'commercial-traveller'
'bakarna' : 'copper'
'bakarno' : 'copper'
Ta cinjenica ti delimicno pravi program neupotrebljivim, jer ako definises recnik od te 4 odrednice dobices (mozes da testiras u python shellu):
$ python
>>> srEn = { 'agent' : 'agent', 'agent' : 'commercial-traveller', 'bakarna' : 'copper', 'bakarno' : 'copper' }
>>> srEn
{'bakarna': 'copper', 'bakarno': 'copper', 'agent': 'commercial-traveller'}
Kao sto vidis, druga definicija reci 'agent' je zamenila ovu prvu.
Tu dolazimo do problema ucitavanja recnika. Python dict od nekih 20-30 key:value parova, ako se ne menjaju tokom vremena, mozes da 'hard-kodujes' u samom programu, kao sto si to i uradio. Medjutim, ako dict sadrzi nekih 10000 key:value parova sigurno je bolje ucitati to iz nekog fajla, sto je u pythonu trivijalno:
srEn = {}
for line in open('recnik.txt', 'r'):
key, value = line.strip().split(':')
srEn[key] = value
Ovo ti je osnovni kod koji ilustruje princip. Metod split(delimiter) razdvaja string u niz (listu) stringova koristeci znak 'delimiter' kao razdvajac - npr.
string='The;Big;Brown;Fox'
words = string.split(';')
vraca niz 'words' koji ce u sebi imati 4 elementa: [ 'The', 'Big', 'Brown', 'Fox' ].
Ali to je sve daleko od resenja, jer recnik koji si postavio sadrzi nekoliko zackoljica koje moras da razresis.
Prvi problem je ovo sto je vec opisano gore. Najjednostavniji nacin je da prevode razmaknes znakom ';', kao sto se to radi u pravim recnicima. Kod onda postaje:
srEn = {}
for line in open('recnik.txt', 'r'):
key, value = line.strip().split(':')
if (key not in srEn):
srEn[key] = value
else:
srEn[key] += '; ' + value
Drugi nacin, koji lici na ovo tvoje resenje, je da ti prevodi uvek budu nizovi, odnosno liste, pa da dobijes recnik tipa:
srEn = { 'agent' : [ 'agent', 'commercial-traveller'], 'bakarna' : ['copper'], 'bakarno' : ['copper'] }
Takvu strukturu mozes da napunis iz fajla na sledeci nacin:
srEn = {}
for line in open('recnik.txt', 'r'):
key, value = line.strip().split(':')
if (key not in srEn)
srEn[key] = [ value ]
else:
srEn[key].append(value)
Verovatno primecujes da sam na pocetku u oba slucaja stavio:
srEn = {}
Mada Python ne zahteva da promenljive deklarises kao u C/C++ na primer, svaka promenljiva koju koristis mora da bude definisana pre prvog koriscenja:
b = a + 1
ce vratiti gresku ako 'a' nigde nije definisano. Ispravno je:
a = 0 # ili neka druga vrednost
b = a + 1
Slicno je i sa listama i recnicima - njih takodje moras da inicijalizujes pre koriscenja:
recnik = {}
lista = []
recnik['nova rec'] = 'nesto novo'
lista.append('novi clan')
Drugi problem je sto ces, ako napravis fajl identican ovom zadatom recniku, u kome su reci s leve i s desne strane oivicene navodnicima, prilikom citanja fajla parametri 'key' i 'value' ce dobiti dvostruke navodnike i jos poneki razmak izmedju:
>>> line="'bakarno' : 'copper'"
>>> line.split(':')
["'bakarno' ", " 'copper'"]
A to nije ono sto si hteo. Znaci, prilikom ucitavanja recnika moraces da skines navodnike (odnosno apostrofe), kao i da se resis razmaka. Za brisanje razmaka s leve i desne strane stringa (a.k.a. "trimovanje") koristis funkciju (odnosno metod) strip():
key, value = line.split(':')
key = key.strip()
value = value.strip()
Ostaje jos da skines navodnike na pocetku i kraju izraza, sto je najelegantnije da uradis ovako:
key = key[1:-1] # Izdvaja rec od drugog do pretposlenjeg znaka
value = value[1:-1]
A sada - tutti ... odnosno sve to spojeno u jedno:
srEn = {}
for line in open('recnik.txt', 'r'):
key = line.split(':')[0].strip()[1:-1]
value = line.split(':')[1].strip()[1:-1]
if (key not in srEn)
srEn[key] = [ value ]
else:
srEn[key].append(value)
Potom, neke linije u tvom recniku sadrze samo znak '$'. Njih bi najbolje bilo da preskocis, odnosno da preskocis sve linije koje ne sadrze dvotacku kao separator:
for line in open('recnik.txt', 'r'):
if (':' not in line):
continue
key = ...
Ovde bih stao za sada. Mada, pricu mozemo da sirimo i dalje. Sta raditi kada ti taj fajl s recnikom od 10000 elemenata ukucava neko ko bas nije mnogo pedantan, pa dobijes:
'"agent' : 'agent"
' agent : commercial-traveller'
bakarna :copper
'bakarno' : 'copper'
Ali to je vec zadatak za lekciju o
regularnim izrazima u Pythonu.