Programy Pythona dotyczące operacji na ciągach

Opublikowany: 2022-04-26

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

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

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, łańcuchy są również indeksowane zerem. Zatem prawidłowe indeksy dla łańcucha o długości N to 0, 1, 2 aż do N – 1.

pyton-struny

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.

Teraz, gdy omówiliśmy podstawy ł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 ciąg 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 się tak samo od lewej do prawej, jak i od prawej do lewej. Wymieńmy kilka przykładów: samochód wyścigowy, odsyłacz, poziom, pani, radar i tak dalej.

python-string-palindrom

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 zatrzymaj się.
  • 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 Pythona za pomocą wycinania?

Składnia <any_str>[start: stop: step] zwraca wycinek ciągu <any_str> od start do, ale nie włączając stop , z rozmiarem step .

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

Zatem <any_str>[::-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 racecar 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 river .

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

Jak widać na powyższym wyjściu, palindromes 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 stan-smak, zapis-waza, łokieć pod i tak dalej.

python-struny-anagramy

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 . Obiekt Counter zwraca słownik Pythona: ze znakami jako kluczami i odpowiadającymi im liczbami jako wartościami .

Rozważ ciągi "save" i "vase" , 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.

Używając tej logiki, możemy teraz przejść dalej i zdefiniować funkcję are_anagrams() z dwoma parametrami word1 i word2 . W treści 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 „smakowane” 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-string-title-case
  • Python ma wbudowaną metodę ciągów znaków istitle() , która sprawdza, czy ciąg jest w tytule.

<str>.istitle() zwraca True , jeśli ciąg <str> 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 name .

  • Możesz wywołać istitle() w ciągu wejściowym, aby sprawdzić, czy jest on sformatowany w tytule.
  • Jeśli True , możesz wydrukować, ż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 napisem pisanym wielkimi literami.

 check_titlecase("Grace Hopper") # Output 'Grace Hopper' is already formatted in title case.

Otrzymujemy powiadomienie, że ciąg jest sformatowany w tytułowej wielkości liter, 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() do sprawdzania 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!