Programy Pythona dotyczące operacji na ciągach

W tym samouczku napiszesz programy w Pythonie, które rozwiązują często zadawane pytania dotyczące operacji na ciągach.

Dowiesz się, jak sprawdzić, czy łańcuchy Pythona są palindromami, anagramami i czy znajdują się w przypadku tytułowym.

Ciągi Pythona: szybki przegląd

W Pythonie łańcuchy są potężnymi wbudowanymi typami danych. Mogą przechowywać sekwencję znaków.

Indeksowanie w łańcuchach Pythona: Podobnie jak wszystkie iterable Pythona, również łańcuchy są indeksowane zerem. Zatem prawidłowe indeksy dla łańcucha o długości N to 0, 1, 2 aż do N – 1.

Python obsługuje również indeksowanie ujemne, aby uzyskać dostęp do elementów z końca ciągu. Tak więc -1 to indeks ostatniego znaku w łańcuchu, -2 to indeks przedostatniego znaku w łańcuchu i tak dalej.

Niezmienność ciągów Pythona: Ponadto ciągi w Pythonie są niezmienne, więc nie można ich modyfikować na miejscu. Możesz jednak wywołać na nich kilka metod łańcuchowych i uzyskać kopie łańcuchów z pożądanym wynikiem.

Po zapoznaniu się z podstawami łańcuchów w Pythonie przejdźmy do rozwiązania kilku prostych, ale interesujących problemów.

Zaczynajmy.

Sprawdź, czy ciąg Pythona jest palindromem

Problem: Mając łańcuch Pythona, sprawdź, czy jest to palindrom.

Jeśli tak, zwróć True; w przeciwnym razie zwróć False.

Więc naszym pierwszym problemem jest sprawdzenie, czy dany ciąg jest palindromem.

Palindrom to ciąg, który czyta to samo od lewej do prawej oraz od prawej do lewej. Wymieńmy kilka przykładów: samochód wyścigowy, odsyłacz, poziom, pani, radar i tak dalej.

Oto kroki, aby rozwiązać ten problem:

  • Uzyskaj odwróconą kopię ciągu i w razie potrzeby zapisz ją w innej zmiennej.
  • Porównaj wartości oryginalnego ciągu i odwróconego ciągu.
  • Jeśli są równe, ciąg jest palindromem. Więc zwróć True i przestań.
  • Jeśli oryginał i odwrócona kopia nie są równe, ciąg nie jest palindromem. Powinniśmy więc zwrócić False.

Kluczową operacją jest uzyskanie odwróconej kopii ciągu. W Pythonie można to zrobić na kilka różnych sposobów.

Omówimy jednak dwa podejścia:

  • Korzystanie z krojenia sznurka
  • Korzystanie z funkcji reversed() i metody join()

Jak odwrócić ciąg w Pythonie za pomocą wycinania?

Składnia [start: stop: step] zwraca wycinek łańcucha od początku do końca, ale bez stopu, z krokiem rozmiaru kroku.

  • Jeśli pominiesz początek, plasterek rozpocznie się na początku ciągu.
  • Jeśli nie określisz indeksu zatrzymania, wycinek rozciąga się do końca ciągu.
  • A ujemne wartości kroku mogą być użyte do zwrócenia wycinków zaczynając od końca ciągu.

Więc [::-1] zwraca odwróconą kopię ciągu.

Poniższa komórka kodu zawiera definicję funkcji is_palindrome().

Jako argument przyjmuje ciąg znaków i zwraca True lub False w zależności od tego, czy jest to palindrom.

Tutaj użyliśmy krojenia łańcucha, aby uzyskać odwrotną kopię łańcucha.

def is_palindrome(this_str):
  rev_str = this_str[::-1]
  if (this_str == rev_str):
    return True
  else:
    return False

▶️ Teraz, gdy zdefiniowaliśmy funkcję, możemy przejść dalej i wywołać ją z dowolnym poprawnym ciągiem jako argumentem.

is_palindrome("racecar")
True

W powyższej komórce kodu samochód wyścigowy jest palindromem. Tak więc funkcja is_palindrome() zwraca True zgodnie z oczekiwaniami.

Teraz spróbuj wywołać funkcję z dowolnym łańcuchem, który nie jest palindromem, takim jak rzeka.

is_palindrome("river")
False

I jak widać, zwraca False, co jest poprawne.

Jak odwrócić ciąg Pythona za pomocą reversed() i join()

W Pythonie możesz użyć metody join() wraz z funkcją reversed() do odwrócenia ciągu.

  • Funkcja reversed() zwraca iterator odwrotny poprzez znaki w ciągu.
  • Następnie można użyć metody join() do połączenia tych znaków w odwrotnej kolejności.

Używając powyższej metody, możesz przepisać funkcję is_palindrome() tak, jak w komórce kodu poniżej.

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 listy składanej, aby zebrać wszystkie palindromy z dłuższej listy łańcuchów.

str_list = ["refer","blue","level","12321","dragon"]

palindromes = [string for string in str_list if is_palindrome(string)]
print(palindromes)
# Output
['refer', 'level', '12321']

Oto jak działa powyższy kod:

  • Przejdź przez str_list, wywołaj is_palindrome() na każdym ciągu.
  • Jeśli is_palindrome() zwraca True, dodaj ciąg do listy palindromów.

Jak widać na powyższym wyjściu, palindromy to lista wszystkich łańcuchów palindromicznych w str_list.

Sprawdź, czy dwa ciągi Pythona są anagramami

Innym popularnym pytaniem, na które możesz natknąć się podczas wywiadów, jest sprawdzenie, czy para ciągów str1 i str2 to anagramy.

Mówi się, że dwa ciągi są anagramami, jeśli liczba znaków w dwóch ciągach jest dokładnie taka sama. Oznacza to, że możesz uzyskać jeden z ciągów przez permutację lub zmianę kolejności znaków w drugim ciągu.

Przykłady anagramów to stanowy smak, zapis w wazonie, łokieć pod spodem i tak dalej.

Jak sprawdzić anagramy za pomocą obiektu licznika w Pythonie?

Prostym i intuicyjnym sposobem jest obliczenie liczby wystąpień każdego znaku w dwóch ciągach. A następnie sprawdź, czy liczby są równe.

Tym łatwiej można to zrobić za pomocą obiektu Counter z modułu itertools. The Licznik obiekt zwraca słownik Pythona: ze znakami jako kluczami i odpowiadającymi im liczbami jako wartościami.

Rozważ struny „zapisz” i „waza”, jak pokazano poniżej.

str1 = "save"
str2 = "vase"

Tutaj c1 i c2 są obiektami licznika zawierającymi liczbę znaków odpowiednio w łańcuchach str1 i str2.

from collections import Counter
c1 = Counter(str1)
c2 = Counter(str2)
print(c1)
print(c2)
c1 == c2

# Output
Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1})
Counter({'v': 1, 'a': 1, 's': 1, 'e': 1})
True

c1 == c2 zwraca True, ponieważ str1 i str2 są anagramami.

Korzystając z tej logiki, możemy teraz przejść dalej i zdefiniować funkcję are_anagrams() z dwoma parametrami word1 i word2. W ciele funkcji sprawdzamy, czy Counter(word1) == Counter(word2).

def are_anagrams(word1, word2):
  if Counter(word1) ==  Counter(word2):
    return True
  else:
    return False

▶️ Aby zweryfikować, wywołaj are_anagrams() z argumentami str1, str2. Ponieważ str1 i str2 są anagramami („zapisz” i „waza”), funkcja zwraca True, co jest poprawne.

are_anagrams(str1, str2)
True

Jak sprawdzić anagramy za pomocą posortowanych kopii ciągów?

Jest inny sposób, w jaki możesz to zrobić.

Jeśli dwa łańcuchy są anagramami, to ich posortowane kopie są równe.

Możemy więc przepisać funkcję are_anagrams(), aby sprawdzić, czy posortowana wersja str1 jest taka sama jak posortowana kopia str2. Jeśli są równe, to te dwa łańcuchy są anagramami; inaczej nie są.

Używając powyższej metody do sprawdzenia równości posortowanych kopii, możemy przepisać funkcję are_anagrams() w następujący sposób.

def are_anagrams(word1, word2):
  if sorted(word1) ==  sorted(word2):
    return True
  else:
    return False

Zróbmy teraz kilka wywołań funkcji.

  • Ciągi „łokieć” i „poniżej” są anagramami, a funkcja are_anagrams() zwraca True.
  • A „stan” i „smakował” nie są anagramami, a funkcja zwraca False.
are_anagrams("below","elbow")
True

are_anagrams("state","tasted")
False

Sprawdź, czy ciąg Pythona jest w tytule przypadku

Oto nasze ostatnie pytanie do tego samouczka.

Problem: Podano ciąg: imię osoby — z imieniem i nazwiskiem.

Musisz sprawdzić, czy pierwsza litera imienia i nazwiska jest pisana wielkimi literami.

Ten typ wielkości liter, w którym pierwsza litera każdego słowa jest pisana wielką literą, nazywa się wielkością liter.

Musisz więc sprawdzić, czy nazwa jest pisana wielkimi literami:

1. Jeśli tak, wyślij komunikat, że formatowanie jest w tytule.

2. W przeciwnym razie zwróć kopię ciągu sformatowanego w tytule

  • Python ma wbudowaną metodę ciągów znaków istitle(), która sprawdza, czy ciąg jest w tytule.

.istitle() zwraca True, jeśli łańcuch jest sformatowany w tytule, w przeciwnym razie zwraca False.

  • A metoda string title() Pythona zwraca kopię ciągu znaków sformatowanego w tytule.

Więc teraz możesz użyć tych dwóch metod, aby rozwiązać problem.

Zdefiniuj funkcję check_titlecase(), która jako argument przyjmuje nazwę.

  • Możesz wywołać metodę istitle() w ciągu wejściowym, aby sprawdzić, czy jest on sformatowany w tytule.
  • Jeśli True, możesz wypisać, że ciąg jest już w tytule.
  • W przeciwnym razie możesz wywołać metodę title() i zwrócić kopię ciągu w tytule.

Poniższa komórka kodu zawiera definicję funkcji check_titlecase().

def check_titlecase(name):
  if name.istitle():
    print(f"'{name}' is already formatted in title case.")
  else:
    return name.title()

Wywołajmy teraz metodę check_titlecase() z argumentem.

check_titlecase("jane smith")

# Output
Jane Smith

W powyższym wyniku widać, że ciąg „Jane Smith” jest teraz w tytule.

▶️ Weźmy inny przykład.

check_titlecase("agatha Christie")

# Output
Agatha Christie

Tym razem wywołajmy funkcję z ciągiem pisanym wielkimi literami tytułu.

check_titlecase("Grace Hopper")

# Output
'Grace Hopper' is already formatted in title case.

Otrzymujemy powiadomienie, że ciąg jest sformatowany w przypadku tytułu, a funkcja działa zgodnie z oczekiwaniami.

Wniosek 👩‍🏫

Podsumujmy teraz problemy, które omówiliśmy do tej pory.

  • Aby sprawdzić, czy ciąg jest palindromem, sprawdź, czy ciąg i jego odwrócona wersja są równe. Możesz użyć dzielenia ciągów lub metod wbudowanych, aby odwrócić ciągi.
  • Aby sprawdzić, czy dwa łańcuchy są anagramami, sprawdź, czy ich posortowane kopie są równe. Aby posortować ciąg, użyj wbudowanej funkcji sorted().
  • Aby sprawdzić, czy nazwa jest pisana wielkością liter, użyj metody .istitle() w celu sprawdzenia i metody .title() , aby uzyskać kopię ciągu pisaną wielkością liter.

Mam nadzieję, że podobał Ci się ten samouczek dotyczący łańcuchów w Pythonie. W następnym kroku naucz się używać wyrażeń listowych w Pythonie lub dowiedz się o operatorze nierównym w Pythonie.

Miłej nauki i kodowania!🎉