Programy Pythona dotyczące operacji na ciągach

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 [start: stop: step] zwraca wycinek tekstu , zaczynając od indeksu start, aż do indeksu stop (wyłącznie), z krokiem o rozmiarze step.

  • 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 [::-1] zwróci odwróconą kopię tekstu.

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.

.istitle() zwraca True, jeżeli tekst jest sformatowany w formacie tytułu, w przeciwnym razie zwraca False.

  • 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