Listák szótára

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'

with

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'], …}
…