Szótárak (dictionary)
Szótár létrehozása, metódusok használata
Listát és rendezett n-est használtunk néhány adatstruktúrák megjegyzésére. Az egyes elemekhez számindexek segítségével jutottunk hozzá. Vannak esetek, amikor a számindex helyett másra lenne szükségünk. Készítünk egy programot, ami bekéri emberek nevét és magasságát, ezután kiírja az átlagmagasságot. Ha megadjuk a személy nevét, akkor kiírja a magasságát. Az eddigi tudásunk alapján a következő programot alkothatjuk meg:

A neveket és magasságokat két külön listában tároljuk. A megadott névhez tartozó magasságot kicsit bonyolultan keressük. Először az index metódussal a nevek listában megállapítjuk a név indexét, majd a magassagok listából lekérjük az ezen az indexen lévő értéket.
Ilyen esetekben célszerűbb szótárat használni. A szótárakban elempárok vannak, melyek vesszővel elválasztva vannak felsorolva, és az egész objetumot kapcsoszárójelek fogják közre. Az elempárok első tagját kulcsnak (key) nevezzük, a másodikat pedig a kulcshoz tartozó értéknek (value). A nevével ellentétben a szótárban az elempárok nem csak szó:szó (azaz karakterlánc:karakterlánc) összetételűek lehetnek. A kulcs értéke bármilyen objektum lehet, de maga a kulcs csak olyan, ami nem módosítható.

A szótárban egy kulcs csak egyszer szerepelhet. Az eddig tanult típusok közül a listán kívül bármi lehet kulcs. A len() függvény a szótárban lévő elempárok számát adja vissza.
A mintaprogramunkat módosítjuk úgy, hogy a két lista helyett egy szótárat fogunk használni. A kulcsok a személyek nevei lesznek, az értékek a magasságok.

A sum() függvény a szótárra nem működik, az értékekre van szükségünk hozzá, ezt pedig a values() függvénnyel érjük el. A program második részében a keresésnél, ha a megadott név nincs a szótárban, akkor a None értéket kapjuk vissza.
A list() függvénnyel létrehozhatunk egy listát a szótár értékeiből (vagy a tuple()-val rendezett n-est).
A keys() függvény a szótár kulcsait adja vissza, amelyekből szintén létrehozhatunk listát vagy rendezett n-est.
Az items() függvény az elempárokat adja vissza, ezekből szintén létrehozhatunk listát vagy rendezett n-est. Ebben az esetben ezek elemei a párok lesznek (kulcs, érték), vagyis n-esek.
For ciklus segítségével végigmehetünk a kulcsokon, az értékeken, vagy az elempárokon is.

A szavak.txt fájlban minden sorban angol és magyar kifejezések vannak pontosvesszővel elválasztva.
Készítünk egy programot, amely beolvassa a szavakat egy szótárba, majd tesztelni fog minket. Először létrehozunk egy en_hu szótárat, amelyben az angol szavak lesznek a kulcsok, a magyar szavak az értékek.

Most létrehozzuk a fordított szótárat is a magyarról angolra való fordításhoz.

Titkosítás véletlen helyettesítéssel
A cikk.txt fájlban egy internetes cikk található, amit titkosítani szeretnénk véltelen helyettesítéssel. Ez azt jelenti, hogy a szöveg minden karakteréhez egy véletlen karaktert rendelünk. Ugyanakkor igaz, hogy ugyanahhoz a karakterhez ugyanazt a véletlen karaktert rendeljük. A titkosított szöveget a cikk_titkositva.txt fájlba mentsük el. A helyettesítési táblát (régi karakter és új karakter) a cikk_kulcs.txt fájlba mentsük el.
Gondold végig, milyen lépéseket kell a programban elvégezni?
Melyik karaktereket kell a helyettesítsi táblának tartalmaznia? Hogyan minimalizálhatjuk a tábla méretét?Hogyan érjük el, hogy a helyettesítési táblában minden használt karakter csak egyszer szerepeljen?
Nézzük meg az alábbi programot:

A teljes szöveget egy változóba olvassuk be. Majd karakterenként haladva kialakítjuk a bemeneti ábécét (vagyis minden használt karaktert - minden karaktert csak egyszer adunk a listához). Először megnézzük, hogy az adott karakter már benne van-e a listában, ha nincs, akkor hozzáadjuk. Ezután létrehozzuk a lista másolatát (kevert = karakterek[:]), amit a shuffle utasítással megkeverünk.
Létrehozzuk a helyettesites szótárat, ahol a kulcs az eredeti karakter, az érték pedig a titkosított. Így már titkosítani tudjuk a szöveget, amit egy fájlba mentünk.
A random.shuffle() utasítással milyen típusokat tudunk megkeverni?
Hogyan kevernénk meg az elemeket a random.shuffle() nélkül?
Miért hoztuk létre a karakterek lista másolatát, a kevert változót?
Hogyan nézne ki a program a fordított eljárásra?
Milyen körülmények között nem fog helyesen működni a program? Melyik karakterek okozhatnak gondot?
Előfordulási gyakoriság
Karakterek gyakorisága
Egy szótár segítségével létrehozhatjuk karakterek, szavak, vagy más adatok gyakorisági táblázatát. A gyakorisági táblázat a figyelt értékek és az előfordulásuk mennyisége alkotta szótár. Például létrehozahtunk egy gyakorisági táblázatot arról, hogy egyes karakterek az adott szövegben mennyiszer fordulnak elő.
Mit gondolsz? Ha hosszabb szöveget vizsgálunk, más lesz a karakterek gyakorisága?
Különböző nyelvű szövegekben a karakterek gyakorisági táblázata más lesz?
Samuel Morse létrehozta az anglo ábécé kódolt változatát, a Morse abécét, amelyben rövid és hosszú jelek váltakoznak. 1844-től használták ezt a kódolást a távíróban. Mit gondolsz, melyik betűk kaptak rövidebb és melyek hosszabb kódolást? Miért?
Az angol_szoveg.txt fájlban három angol cikk található a www.bbc.com oldalról. A fájlból létrehozzunk az angol abécé jeleiből a gyakorisági táblázatot - a többi jelet figyelmen kívűl hagyjuk. Hogy ne kelljen külön számolnunk a kis és nagy betűket, ezért mindegyiket kicsire változtatjuk. A gyakorisági táblázatot egy print segítségével kiíratjuk.

Ez a kiírás nem annyira átlátható. Jó lenne például a gyakoriság szerint sorbarendezni a betűket. A listáknál használt sort() utasítás a szótárakon sajnos nem működik. De használhatjuk a sorted() utasítást, amelyben két paramétert fogunk használni: key = gyakorisag.get és reverse = True. A key paraméter adja meg, hogy milyen függvényt használjon a sorbarendezésnél, tehát a mi esetünkben a gyakorisag kulcsait fogja sorbarendezni az értékük szerint. A reverse paraméterrel azt adhatjuk meg, hogy csökkenő vagy növekvő sorrendbe rendezzük az elemeket.

Az alábbi táblázat segít dekódolni a Morse ábécét.

Készítsünk programot, amely az előbbi program gyakorisag-ából generál egy ilyen táblázatot. Az eredeti programhot kiegészítjük a tábla kirajzolásábal. Mielőtt még futtatnánk a programot, próbáljuk megérteni és szimulálni a működését.

