Programy Pythona dotyczące operacji na ciągach
Opublikowany: 2022-04-26W 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.

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.

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
stepmogą 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łajis_palindrome()na każdym ciągu. - Jeśli
is_palindrome()zwracaTrue, dodaj ciąg do listypalindromes.
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.

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) TrueJak 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 FalseZróbmy teraz kilka wywołań funkcji.
- Ciągi „łokieć” i „poniżej” są anagramami, a funkcja
are_anagrams()zwracaTrue. - A „stan” i „smakowane” nie są anagramami, a funkcja zwraca
False.
are_anagrams("below","elbow") True are_anagrams("state","tasted") FalseSprawdź, 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.
<str>.istitle()zwracaTrue, jeśli ciąg<str>jest sformatowany w tytule, w przeciwnym razie zwracaFalse.
- 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 SmithW powyższym wyniku widać, że ciąg „Jane Smith” jest teraz w tytule.
️ Weźmy inny przykład.
check_titlecase("agatha Christie") # Output Agatha ChristieTym 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!
