W tym poradniku nauczysz się tworzyć programy w języku Python, które rozwiązują często pojawiające się zadania związane z operacjami na tekstach.
Odkryjesz, jak w Pythonie można zweryfikować, czy dany ciąg znaków jest palindromem, anagramem, oraz czy jest zapisany w formacie tytułu.
Teksty w Pythonie: krótkie przypomnienie
W Pythonie teksty (stringi) są fundamentalnymi, wbudowanymi typami danych. Służą do przechowywania sekwencji znaków.
Indeksowanie tekstów w Pythonie: Podobnie jak inne obiekty iterowalne w Pythonie, teksty są indeksowane od zera. Oznacza to, że dla tekstu o długości N, poprawne indeksy to 0, 1, 2, aż do N – 1.
Python umożliwia także indeksowanie ujemne, co pozwala na dostęp do elementów od końca tekstu. W ten sposób, -1 odnosi się do ostatniego znaku, -2 do przedostatniego, i tak dalej.
Niezmienność tekstów w Pythonie: Teksty w Pythonie są niezmienne, co oznacza, że nie można ich modyfikować bezpośrednio. Możesz jednak korzystać z różnych metod tekstowych, które zwracają nowe teksty z wprowadzonymi zmianami.
Po przypomnieniu podstaw dotyczących tekstów w Pythonie, przejdźmy do analizy kilku prostych, ale interesujących problemów.
Zaczynajmy.
Weryfikacja, czy tekst w Pythonie jest palindromem
Zadanie: Sprawdzić, czy podany tekst w Pythonie jest palindromem.
W przypadku, gdy tekst jest palindromem, zwróć True; w przeciwnym razie zwróć False.
Naszym pierwszym wyzwaniem jest więc ustalenie, czy dany ciąg znaków jest palindromem.
Palindrom to tekst, który brzmi tak samo, czytany od lewej do prawej, jak i od prawej do lewej. Przykłady to: „kajak”, „potop”, „zakaz”, „sedes”, „radar”.
Oto kroki potrzebne do rozwiązania tego zadania:
- Stwórz odwróconą kopię tekstu i, w razie potrzeby, zapisz ją w nowej zmiennej.
- Porównaj oryginalny tekst z jego odwróconą wersją.
- Jeśli są identyczne, tekst jest palindromem. Zwróć True i zakończ działanie.
- Jeżeli oryginał i kopia nie są równe, tekst nie jest palindromem. Zwróć False.
Kluczową operacją jest uzyskanie odwróconej kopii tekstu. W Pythonie można to osiągnąć na kilka sposobów.
Przeanalizujemy dwa podejścia:
- Użycie wycinków tekstu (slicing).
- Wykorzystanie funkcji reversed() oraz metody join().
Jak odwrócić tekst w Pythonie za pomocą wycinków?
Składnia
- Pominięcie start oznacza, że wycinek zacznie się od początku tekstu.
- Brak stop spowoduje, że wycinek rozciągnie się do końca tekstu.
- Ujemna wartość step może być wykorzystana do pobrania wycinków, zaczynając od końca tekstu.
Zatem
Poniższy kod zawiera definicję funkcji is_palindrome().
Funkcja przyjmuje tekst jako argument i zwraca True lub False, w zależności od tego, czy tekst jest palindromem.
Użyliśmy wycinania tekstu, aby utworzyć jego odwróconą kopię.
def is_palindrome(this_str): rev_str = this_str[::-1] if (this_str == rev_str): return True else: return False
▶️ Teraz, gdy funkcja jest zdefiniowana, możemy ją przetestować z dowolnym tekstem jako argumentem.
is_palindrome("kajak") True
W powyższym przykładzie słowo „kajak” jest palindromem. Funkcja is_palindrome() zwraca True, zgodnie z oczekiwaniami.
Teraz wywołajmy funkcję z tekstem, który nie jest palindromem, np. „rzeka”.
is_palindrome("rzeka") False
Jak widać, funkcja zwraca False, co jest poprawne.
Jak odwrócić tekst w Pythonie za pomocą reversed() i join()?
W Pythonie możesz użyć metody join() w połączeniu z funkcją reversed() do odwrócenia tekstu.
- Funkcja reversed() zwraca iterator, który przechodzi przez znaki tekstu w odwrotnej kolejności.
- Następnie, metoda join() łączy te znaki w odwrotnej kolejności.
Korzystając z tej metody, możemy zmodyfikować funkcję is_palindrome(), tak jak w poniższym kodzie.
def is_palindrome(this_str): rev_str="".join(reversed(this_str)) if (this_str == rev_str): return True else: return False
Możesz również użyć funkcji is_palindrome() wewnątrz składni listowej (list comprehension), aby wyselekcjonować wszystkie palindromy z dłuższej listy tekstów.
str_list = ["kajak","niebieski","potop","12321","smok"] palindromes = [string for string in str_list if is_palindrome(string)] print(palindromes) # Output ['kajak', 'potop', '12321']
Oto, jak działa powyższy kod:
- Przechodzimy przez listę str_list, wywołując is_palindrome() dla każdego tekstu.
- Jeżeli is_palindrome() zwraca True, dany tekst jest dodawany do listy palindromów.
Jak widać na wyjściu, palindromy to lista wszystkich tekstów, które są palindromami w str_list.
Sprawdzenie, czy dwa teksty w Pythonie są anagramami
Innym popularnym zadaniem, które może pojawić się podczas rozmów kwalifikacyjnych, jest sprawdzenie, czy para tekstów str1 i str2 to anagramy.
Mówimy, że dwa teksty są anagramami, jeśli liczba poszczególnych znaków w obu tekstach jest dokładnie taka sama. Oznacza to, że jeden z tekstów można uzyskać poprzez zmianę kolejności znaków w drugim tekście.
Przykłady anagramów to „kot” i „tok”, „talerz” i „rzetelna”.
Jak sprawdzić anagramy za pomocą obiektu Counter w Pythonie?
Prostym i intuicyjnym sposobem jest policzenie wystąpień każdego znaku w obu tekstach. Następnie sprawdzamy, czy liczby wystąpień dla każdego znaku są identyczne w obu tekstach.
Możemy to łatwo zrobić, korzystając z obiektu Counter z modułu itertools. Obiekt Counter zwraca słownik Pythona: kluczami są znaki, a wartościami odpowiadające im liczby wystąpień.
Rozważmy teksty „kino” i „ikon”, jak pokazano poniżej.
str1 = "kino" str2 = "ikon"
Tutaj c1 i c2 to obiekty licznika, przechowujące liczbę wystąpień znaków odpowiednio w tekstach str1 i str2.
from collections import Counter c1 = Counter(str1) c2 = Counter(str2) print(c1) print(c2) c1 == c2 # Output Counter({'k': 1, 'i': 1, 'n': 1, 'o': 1}) Counter({'i': 1, 'k': 1, 'o': 1, 'n': 1}) True
c1 == c2 zwraca True, ponieważ str1 i str2 są anagramami.
Korzystając z tej logiki, możemy zdefiniować funkcję are_anagrams() z dwoma parametrami word1 i word2. Wewnątrz funkcji sprawdzamy, czy Counter(word1) == Counter(word2).
def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False
▶️ Aby sprawdzić, wywołajmy are_anagrams() z argumentami str1, str2. Ponieważ str1 i str2 to anagramy („kino” i „ikon”), funkcja zwraca True, co jest poprawne.
are_anagrams(str1, str2) True
Jak sprawdzić anagramy, sortując kopie tekstów?
Jest jeszcze inny sposób, w jaki możemy to zrobić.
Jeżeli dwa teksty są anagramami, to ich posortowane kopie będą identyczne.
Możemy więc zmodyfikować funkcję are_anagrams(), aby sprawdzić, czy posortowana wersja str1 jest identyczna z posortowaną kopią str2. Jeżeli są identyczne, to te dwa teksty są anagramami; w przeciwnym przypadku nie.
Wykorzystując powyższą metodę, możemy zmodyfikować funkcję are_anagrams() w następujący sposób.
def are_anagrams(word1, word2): if sorted(word1) == sorted(word2): return True else: return False
Wykonajmy teraz kilka wywołań funkcji.
- Teksty „kot” i „tok” są anagramami, a funkcja are_anagrams() zwraca True.
- Teksty „mama” i „tata” nie są anagramami, a funkcja zwraca False.
are_anagrams("kot","tok") True are_anagrams("mama","tata") False
Sprawdzenie, czy tekst w Pythonie jest zapisany w formacie tytułu
Oto nasze ostatnie zadanie w tym poradniku.
Zadanie: Dany jest tekst: imię i nazwisko osoby.
Musisz sprawdzić, czy pierwsza litera imienia i nazwiska jest zapisana wielką literą.
Ten sposób formatowania, gdzie pierwsza litera każdego słowa jest wielka, nazywamy formatem tytułu.
Należy więc sprawdzić, czy nazwa jest w formacie tytułu:
1. Jeżeli tak, wypisz informację, że tekst jest już sformatowany w formacie tytułu.
2. W przeciwnym razie zwróć kopię tekstu sformatowanego w formacie tytułu.
- Python ma wbudowaną metodę tekstową istitle(), która sprawdza, czy tekst jest w formacie tytułu.
- Metoda tekstowa title() w Pythonie zwraca kopię tekstu sformatowanego w formacie tytułu.
Możesz teraz użyć tych dwóch metod, aby rozwiązać problem.
Zdefiniujmy funkcję check_titlecase(), która przyjmuje nazwę jako argument.
- Możemy wywołać metodę istitle() na wejściowym tekście, aby sprawdzić, czy jest w formacie tytułu.
- Jeżeli jest True, wypiszemy, że tekst jest już w formacie tytułu.
- W przeciwnym razie, wywołamy metodę title() i zwrócimy kopię tekstu w formacie tytułu.
Poniższy kod zawiera definicję funkcji check_titlecase().
def check_titlecase(name): if name.istitle(): print(f"'{name}' jest już sformatowany w formacie tytułu.") else: return name.title()
Wywołajmy teraz funkcję check_titlecase() z argumentem.
check_titlecase("jan kowalski") # Output Jan Kowalski
W powyższym wyniku widzimy, że tekst „Jan Kowalski” jest teraz w formacie tytułu.
▶️ Weźmy inny przykład.
check_titlecase("maria skłodowska-curie") # Output Maria Skłodowska-Curie
Tym razem wywołajmy funkcję z tekstem już zapisanym w formacie tytułu.
check_titlecase("Anna Nowak") # Output 'Anna Nowak' jest już sformatowany w formacie tytułu.
Otrzymujemy informację, że tekst jest sformatowany w formacie tytułu i funkcja działa zgodnie z oczekiwaniami.
Podsumowanie 👩🏫
Podsumujmy teraz problemy, które omówiliśmy.
- Aby sprawdzić, czy tekst jest palindromem, zweryfikuj, czy tekst i jego odwrócona wersja są identyczne. Możesz skorzystać z wycinania tekstu lub wbudowanych metod, aby odwrócić tekst.
- Aby sprawdzić, czy dwa teksty są anagramami, upewnij się, że ich posortowane kopie są identyczne. Do sortowania tekstu użyj wbudowanej funkcji sorted().
- Aby sprawdzić, czy nazwa jest zapisana w formacie tytułu, skorzystaj z metody .istitle() do weryfikacji, oraz z metody .title() , aby uzyskać kopię tekstu zapisaną w formacie tytułu.
Mam nadzieję, że ten poradnik dotyczący operacji na tekstach w Pythonie był dla Ciebie interesujący. W następnym kroku, naucz się jak stosować list składane w Pythonie lub poznaj operator nierówności w Pythonie.
Życzę owocnej nauki i kodowania!🎉
newsblog.pl