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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
def ekezetmentes1(s: str) -> str: ékezetesek = 'áéíóöőúüűÁÉÍÓÖŐÚÜŰ' helyettesítők = 'aeiooouuuAEIOOOUUU' eredmény = s for c in s: if c in ékezetesek: eredmény = eredmény.replace(c, helyettesítők[ékezetesek.find(c)]) return eredmény def ekezetmentes2(s: str) -> str: ékezetesek = 'áéíóöőúüűÁÉÍÓÖŐÚÜŰ' helyettesítők = 'aeiooouuuAEIOOOUUU' return ''.join([c if c not in ékezetesek else helyettesítők[ékezetesek.find(c)] for c in s]) def ekezetmentes3(s: str) -> str: d = dict(zip('áéíóöőúüűÁÉÍÓÖŐÚÜŰ', 'aeiooouuuAEIOOOUUU')) return ''.join([d.get(c, c) for c in s]) def ekezetmentes4(s: str) -> str: d = dict(zip('áéíóöőúüűÁÉÍÓÖŐÚÜŰ', 'aeiooouuuAEIOOOUUU')) eredmény = s for ékezetes in d: if ékezetes in s: eredmény = eredmény.replace(ékezetes, d.get(ékezetes)) return eredmény def ekezetmentes5(s: str) -> str: return s.translate(str.maketrans('áéíóöőúüűÁÉÍÓÖŐÚÜŰ', 'aeiooouuuAEIOOOUUU')) # TESZT szöveg = 'Űrhajóban üldögélő újságíró' for ekezetmentes in (ekezetmentes1, ekezetmentes2, ekezetmentes3, ekezetmentes4, ekezetmentes5): print((ekezetmentes(szöveg))) # Mindegyik eredménye: "Urhajoban uldogelo ujsagiro" |
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ó.