Hogyan állapítsuk meg, hogy egy szó vagy szöveg palindrom-e?

Í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ó)

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.

É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.