Bizonyos esetekben szükség lehet arra, hogy egy karakterláncból adott karaktereket eltávolítsunk. Ilyen eset lehet például, ha egy szövegben csak a szavakat szeretnénk feldolgozni. Ehhez az írásjeleket először el kell távolítani.
A feladat többféleképpen is megoldható, ahogy az alább látható.
|
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 |
txt = 'Nyertem! Ez biztos? Igen, mert már kifizették.'.lower() def remove_chars1(text, chars_to_delete = '.,!?'): for c in chars_to_delete: text=text.replace(c,'') return text def remove_chars2(text, chars_to_delete = '.,!?'): return ''.join(filter(lambda c: c if c not in chars_to_delete else '', text)) def remove_chars3(text, chars_to_delete = '.,!?'): return ''.join(c for c in text if c not in chars_to_delete) def remove_chars4(text, chars_to_delete = '.,!?'): return text.translate(dict.fromkeys(map(ord, chars_to_delete))) def remove_chars5(text, chars_to_delete = '.,!?'): return text.translate(str.maketrans(*[chars_to_delete]*3)) def remove_chars6(text, chars_to_delete = '.,!?'): return text.translate(str.maketrans('' , '' , chars_to_delete)) # TESZT for remove_chars in (remove_chars1, remove_chars2, remove_chars3, remove_chars4, remove_chars5, remove_chars6): print(remove_chars(txt)) # Eredmény mindegyik esetben: nyertem ez biztos igen mert már kifizették |
Azt, hogy ezek közül melyiket alkalmazzuk az függhet attól, hogy
– mennyire vagyunk tájékozottak az alkalmazható nyelvi konstrukciók tekintetében, azaz melyek jutnak egyáltalán eszünkbe,
– melyik megoldást tartjuk könnyebben értelmezhetőbbnek, azaz olvashatóbbnak,
– mennyire szempont a megoldás költségessége (memóriafelhasználás és/vagy futási idő). Ha ezek szempontok, mely megoldások teljesítik az ilyen jellegű követelményeket.
Például az első függvényben alkalmazott, ciklussal megvalósított megoldás hátránya, hogy bár gyors, de memóriafelhasználásban nem optimális, mert minden helyettesítési ciklusban egy új text példányt állít elő.
A 2. és 3. megoldás a join() függvénnyel operál. Olvashatóság szempontjából a filter() függvényt használó nem annyira jó.
A 4., 5. és 6. megoldások mindegyike a translate() metódust használja, és abban térnek el, hogy ennek argumentumát hogyan állítjuk elő. Olvashatóság szempontjából az utolsó változat talán a legkedvezőbb. Ugyanakkor, a translate() és a maketrans() metódusok használata nem annyira magától értetődő, mint az előző megoldásokban alkalmazott konstrukcióké.
Ahogy látjuk a karaktereltávolító függvényekben a str típus translate(), maketrans() és replace() metódusai szerepeltek. Ezek használatáró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. A filter(), illetve a map() és ord() függvényekről a „Beépített függvények” fejezetben, a generátorkifejezésekről pedig a „Műveletek” fejezet „Iterátorépítés – generátorkifejezés” cím alatt lehet tájékozódni.