Írjunk egy függvényt, amely az argumentumként kapott karakterláncról megállapítja, hogy palindrom-e. Ha igen, akkor True, ha nem, akkor False értékkel tér vissza.
Ehhez először is tisztázni kell, hogy mi a palindrom. Nem csak azért, mert nem biztos, hogy mindenki ismeri ezt a szót, hanem azért, mert attól függ majd a függvényünk kódja, hogy milyen tágan értelmezzük a palindromot.
A palindrom olyan szó, szókapcsolat vagy szöveg, amelynél visszafelé véve a betűket is ugyanazt kapjuk. Ilyen például a „görög”. Ez a palindrom legszűkebb értelmezése, és ennek a kritériumnak viszonylag kevés értelmes szó vagy szöveg tud megfelelni. Viszont a függvényünk nagyon egyszerű lesz, hiszen csak a karakterlánc elemeit kell fordított sorrendbe tenni és összevetni az eredetivel. Ezt mutatja az alábbi kódsor első függvénye, ahol a sorrendfordítást szeletképzéssel valósítottuk meg. (Erről egy korábbi bejegyzésben volt már szó)
|
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 40 |
def palindrom1(szöveg: str) -> bool: return szöveg == szöveg[::-1] # TESZT print(palindrom1('görög')) # True print(palindrom1('Görög')) # False def palindrom2(szöveg: str) -> bool: s = szöveg.lower() return s == s[::-1] # TESZT print(palindrom2('Görög')) # True print(palindrom2('Keleti telek')) # False def palindrom3(szöveg: str) -> bool: s = szöveg.lower().replace(' ', '') return s == s[::-1] # TESZT print(palindrom3('Keleti telek')) # True print(palindrom3('Artúr, át a Határ útra!')) # False def palindrom4(szöveg: str) -> bool: s = szöveg.lower().translate(str.maketrans(dict.fromkeys(' .,;!?-:…()–', None))) return s == s[::-1] # TESZT print(palindrom4('Artúr, át a Határ útra!')) # True print(palindrom4('Ön Barbara, arab rabnő?')) # False def palindrom5(szöveg: str) -> bool: s = szöveg.lower().translate(str.maketrans('áéíóőúű', 'aeioöuü', ' .,;!?-:…()–')) return s == s[::-1] # TESZT print(palindrom5('Ön Barbara, arab rabnő?')) # True print(palindrom5('A sári pap írása.')) # True |
Azt is láthatjuk, hogy e szigorú értelmezésnek már az sem felel meg, ha nagybetűvel kezdődik a szó.
Ha megengedjük a nagybetűket, akkor a függvényünkben csak annyit kell változtatni, hogy a kapott karaktersort a lower() metódussal kisbetűsre konvertáljuk. Ezt látjuk a második függvényben.
Tovább enyhíthetünk a palindrom meghatározásán, ha elég annyi, hogy az egyezésnek a visszafelé kimondott hangsorral kell meglenni. Ilyenkor ugyanis nem csak a nagybetű, hanem a betűk tagolása sem számít. Most tehát pl. a „Gödrös ördög” már jó megoldás.
Ezt a követelménymódosítást tükrözi a harmadik függvény, ahol nem csak kisbetűsre konvertáltuk a szöveget, hanem eltávolítottunk minden szóközt is a replace() metódussal.
Lehet palindrom akár egy egész mondat. Ekkor azonban az írásjelek is előkerülhetnek. A kimondott hangsorban ezek külön nem jelennek meg, de a harmadikként szereplő függvény ezt nem tudja megfelelően kezelni, ezért tovább kell fejleszteni. Ezt elég egyszerűen megtehetjük, ha alkalmazzuk a karakterláncokra meghívható translate() és maketrans() metódusokat. Ez utóbbi argumentumaként többek között megadhatunk szótár formájában egy fordító táblát, amely a lecserélendő karaktereket kulcsként, a helyettesítő karaktereket a kulcshoz tartozó értékként tartalmazza. Ha az érték None, akkor az adott karakter törlődik. Esetünkben a szótár kulcsai a szóközön kívül a mondatban előforduló írásjelek lesznek. Mivel ezeket mind törölni akarjuk, ezért a szótár minden kulcsához a None értéket kell rendelni. Ilyen speciális esetben jön jól a dict.fromkeys() metódus, amiről egy korábbi bejegyzésben már szintén volt szó. Ezek felhasználásával feljavított függvénydefiníciót láthatjuk negyedikként.
A palindrom ennél is tágabb értelmezésében megengedjük azt is, hogy a hosszú és rövid magánhangzók ugyanannak számítsanak. Ebben az esetben szintén alkalmazhatjuk a translate() és maketrans() metódusokat, de most a maketrans() metódust három argumentummal hívjuk meg. Az elsőben felsoroljuk a hosszú magánhangzókat, amit lecserélünk a második argumentumban megadott rövid megfelelőjükre. A harmadik argumentum pedig a törlendő írásjeleket és egyéb szimbólumok sorozatát tartalmazza egy karakterláncban.
A függvény e változatát mutatja az utolsó, ötödik definíció, ami már meglepően sok szót, szókapcsolatot és mondatot tud palindromnak minősíteni. Ez azért lehet jó, mert társasági játékra is szokták a palindromképzést használni, és a játék élvezetesebb, ha nagyobb az esély a több jó megoldásra. A bemutatott függvénnyel pedig könnyen ellenőrizhetők a javaslatok. Ahogy láttuk a függvényekben a translate() és maketrans() kiemelt szerepet játszott. Ezekről további részletek példákkal illusztrálva olvasható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.