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
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ł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) 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()
zwracaTrue
. - 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 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 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!