Hogyan cseréljük le egy szövegben az ékezetes magánhangzókat ékezet nélküli megfelelőjükre?

A feladatot több módon is megoldhatjuk. Az első, ami eszünkbe juthat, hogy vesszük sorban egymás után a szöveg karaktereit, és ellenőrizzük, hogy ékezetes magánhangzó-e. Ha igen, akkor a karakterláncokra értelmezett replace() metódussal kicseréljük ezt, és az így módosított karakterlánccal folyatjuk a vizsgálatot és szükség esetén a cserét. Ezt mutatja az alábbi kódsor első függvénydefiníciója.

Ezzel a megoldással a gond, hogy a replace() mindig egy új karakterláncot eredményez, ami hosszú szöveg és sok csere esetén esetleg memóriakapacitás problémát okozhat. A második és harmadik függvényben alkalmazott megoldásokkal ezen segítünk úgy, hogy a vizsgált szöveg karaktereiből egy listát építünk, amit a végén karaktersorozattá egyesítünk a join() metódussal.

A karaktercserét a második függvénynél egy feltételes kifejezéssel valósítjuk meg, melyben ellenőrizzük, hogy a szöveg soron következő karaktere ékezetes-e. Ha nem, akkor a lista aktuális eleme e karakter lesz. Ha pedig igen, ékezetes, akkor az ékezetes karakterek sorozatában kikeressük a find() metódussal az adott karakter indexét, amivel kikérjük a helyettesítő karakterláncban a megfelelő ékezet nélküli betűt, és ez lesz a lista eleme.

A harmadik függvénynél a karaktercserét úgy végezzük el, hogy először is létrehozzuk a lecserélendő és helyettesítő karaktereket összerendelő szótárt. A felépülő lista elemét e szótár get() metódussal kiolvasott értéke adja. Itt kihasználjuk azt, hogy a get() metódusnak lehet alapértelmezett értéket adni, ami jelen esetben a szöveg éppen soron következő karaktere. Ezzel azt érjük el, hogy ha a szöveg soron következő karakterével mint kulccsal hívjuk meg a get() metódust, akkor ha az benne van a szótárban, vagyis ékezetes, akkor az ékezet nélküli megfelelő lesz a visszatérési érték. Ha pedig nincs a szótárban, azaz nem ékezetes karakterről van szó (tehát nem kell csere), akkor az alapértelmezett értékkel tér vissza, ami önmaga.

A fenti megoldásoknak az a hátránya, hogy a vizsgálat a szöveg minden egyes karakterén végigmegy, ami kevés cserét igénylő hosszú szöveg esetén feleslegesen visz el időt. Ezen segítenek a negyedik és ötödik függvényben látható megoldások.

A negyedik függvénynél megfordítjuk az előzőekben látott logikát. Nem a vizsgált szöveg karaktereit vesszük sorra, hanem a cserélendőket, amelyek száma viszonylag kevés és független a vizsgált szöveg hosszától. A cserét itt is a replace() metódussal hajtjuk végre, de csak akkor, ha az éppen sorra vett ékezetes betűt a szöveg tartalmazza. Továbbá kihasználjuk a replace() azon jellemzőjét, hogy a helyettesítést a lecserélendő karakter minden előfordulására elvégzi.

Az utolsó ötödik megoldás a legegyszerűbb és legtömörebb, ahol a karakterlánc translate(), valamint a str típus maketrans() metódusait használtuk.

A translate() és maketrans() használati módja és lehetőségei bővebb magyarázatot és kifejtést igényelnének, amire itt nem tudunk kitérni, de a részletek példákkal illusztrálva elolvashatók a Python tudásépítés lépésről lépésre című e-könyv „Beépített típusok nyilvános metódusai” fejezetében a karakterláncok metódusait tárgyaló alcím alatt, ahol többek között a join(), find() és replace() metódusok részletes leírása is megtalálható.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.