Ne cifrázzuk, lássunk rögtön egy példát (a kimenet áttördelve):
>>> lst1= ['Rúben', 'Simeon', 'Lévi', 'Júda', 'Izsakhár', 'Zebulon'] >>> lst2= ['József', 'Benjámin'] >>> lst3= ['Dán', 'Nafthali'] >>> lst4= ['Gád', 'Áser'] >>> d_l= {'Lea': lst1, 'Rákhel': lst2, 'Bilha': lst3, 'Zilpa': lst4} >>> d_l {'Bilha': ['Dán', 'Nafthali'], 'Rákhel': ['József', 'Benjámin'], 'Zilpa': ['Gád', 'Áser'], 'Lea': ['Rúben', 'Simeon', 'Lévi', 'Júda', 'Izsakhár', 'Zebulon']}
A későbbiekben szükségünk lesz arra, hogy adott kulcshoz tartozó új elemet illesszünk be. Ilyenkor meg kell különböztetnünk azt az esetet, amikor a kulcs már szerepel a szótárban (és így a hozzá tartozó listához kell új elemet adnunk), illetve amikor a kulcs még nem szerepel a szótárban (és így új kulcs-érték párt kell beszúrnunk):
>>> if 'Lea' in d_l: ... d_l['Lea']+= ['Dína'] ... else: ... d_l['Lea'] = ['Dína'] ... >>> d_l {'Bilha': ['Dán', 'Nafthali'], 'Rákhel': ['József', 'Benjámin'], 'Zilpa': ['Gád', 'Áser'], 'Lea': ['Rúben', 'Simeon', 'Lévi', 'Júda', 'Izsakhár', 'Zebulon', 'Dína']}
A fenti szótár 'Lea' indexű eleme értelemszerűen egy lista, melynek 0 indexű eleme egy string:
>>> d_l['Lea'] ['Rúben', 'Simeon', 'Lévi', 'Júda', 'Izsakhár', 'Zebulon'] >>> d_l['Lea'][0] 'Rúben'
A legutóbb megkezdett, SMS szavak című feladatban egy szöveges állományt is létre kell hoznunk (inf_e_20070516_m_04).
Korábban említettük már, hogy az olvasásra megnyitott állományokat is illenék lezárni, állományok írása esetén pedig ez elemi fontosságú. A python nyelv with szerkezete azonban mindkettőről gondoskodik: következzék erre az első példa.
A jól ismert módon végigolvassuk az állomány sorait, s listát építünk az azokban található szavakból. Ezzel párhuzamosan azonban egy másik, a későbbi egységek megoldását előkészítő lépést is elvégzünk: minden szóhoz meghatározzuk a neki megfelelő számsorozatot, s felépítünk egy szótárat, melynek ezek a kódok lesznek a kulcsai, az értékek pedig az egyes kulcsokhoz tartozó (egy vagy többelemű) listák, azaz azok a szavak, melyekhez az adott számsorozat a kód.
_(3) print('Beolvassuk a szavak.txt állományt…') l_wds= [] dl_cw= {} with open('inf_e_20070516_m_04_szavak.txt') as file: for word in file: word= word.strip() l_wds+= [word] code= f_wc(word) if not code in dl_cw: dl_cw[code] = [word] else: dl_cw[code]+= [word]
Talán könnyebb lesz a fentiek megértése, ha megnézzük, hogy alakul a dl_cw változó értéke az egyes sorok (tehát az egyes szavak) beolvasása után (a kimenet többszörösen megkurtítva):
{'22525': ['ablak']} {'22525': ['ablak'], '2276627': ['abroncs']} {'22525': ['ablak'], '2276627': ['abroncs'], '23': ['ad']} {'22525': ['ablak'], '2276627': ['abroncs'], '244': ['agg'], '23': ['ad']} … {'2692': ['anya'], …, '27269': ['arany'], …, '2726967': ['aranyos'], …, '272': ['apa'], …} {'2692': ['anya'], …, '27269': ['arany'], …, '2726967': ['aranyos'], …, '272': ['apa', 'arc'], …} …