У цьому посібнику ви будете писати програми Python для вирішення поширених запитань щодо операцій із рядками.
Ви дізнаєтеся, як перевірити, чи рядки Python є паліндромами, анаграмами та чи містяться вони в регістрі заголовка.
Рядки Python: короткий огляд
У Python рядки є потужними вбудованими типами даних. Вони можуть зберігати послідовність символів.
Індексація в рядках Python: як і всі ітеровані елементи Python, рядки також мають нульовий індекс. Отже, дійсні індекси для рядка довжиною N від 0, 1, 2 до N – 1.
Python також підтримує негативне індексування для доступу до елементів з кінця рядка. Таким чином, -1 – це індекс останнього символу в рядку, -2 – це індекс передостаннього символу в рядку і так далі.
Незмінність рядків Python: Крім того, рядки в Python незмінні, тому ви не можете змінити їх на місці. Однак ви можете викликати кілька методів рядків на них і отримати копії рядків з бажаним результатом.
Тепер, коли ми розглянули основи рядків Python, давайте приступимо до вирішення деяких простих, але цікавих завдань.
Давайте розпочнемо.
Перевірте, чи рядок Python є паліндромом
Проблема: задано рядок Python, перевірте, чи є він паліндромом.
Якщо так, поверніть True; інакше поверніть False.
Отже, наша перша проблема — перевірити, чи є заданий рядок паліндромом.
Паліндром — це рядок, який читається однаково як зліва направо, так і справа наліво. Давайте перерахуємо кілька прикладів: гоночний автомобіль, референт, рівень, мадам, радар і так далі.
Ось кроки для вирішення цієї проблеми:
- Отримайте перевернуту копію рядка та збережіть її в іншій змінній, якщо потрібно.
- Порівняйте значення вихідного рядка та реверсованого рядка.
- Якщо вони рівні, то рядок є паліндромом. Тож поверніть True і зупиніться.
- Якщо оригінальна та перевернута копії не збігаються, рядок не є паліндромом. Тому ми повинні повернути False.
Ключовою операцією є отримання перевернутої копії рядка. У Python це можна зробити кількома способами.
Однак ми розглянемо два підходи:
- Використання нарізки рядків
- Використання функції reversed() і методу join().
Як перевернути рядок Python за допомогою нарізки
Синтаксис
- Якщо опустити початок, фрагмент починається на початку рядка.
- Якщо ви не вкажете індекс зупинки, зріз продовжуватиметься до кінця рядка.
- А від’ємні значення кроку можна використовувати для повернення фрагментів, починаючи з кінця рядка.
Отже,
Наступна клітинка коду містить визначення функції is_palindrome().
Він приймає рядок як аргумент і повертає True або False залежно від того, чи є це паліндромом.
Тут ми використали нарізку рядка, щоб отримати зворотну копію рядка.
def is_palindrome(this_str): rev_str = this_str[::-1] if (this_str == rev_str): return True else: return False
▶️ Тепер, коли ми визначили функцію, ми можемо продовжити та викликати будь-який дійсний рядок як аргумент.
is_palindrome("racecar") True
У наведеній вище клітинці коду гоночний автомобіль є паліндромом. Отже, функція is_palindrome() повертає True, як і очікувалося.
Тепер спробуйте викликати функцію будь-яким рядком, який не є паліндромом, наприклад river.
is_palindrome("river") False
І, як ви можете бачити, він повертає False, що правильно. ✅
Як перевернути рядок Python за допомогою reversed() і join()
У Python ви можете використовувати метод join() разом із функцією reversed(), щоб перевернути рядок.
- Функція reversed() повертає зворотний ітератор через символи в рядку.
- Потім можна використати метод join() для об’єднання цих символів у зворотному порядку.
Використовуючи наведений вище метод, ви можете переписати функцію is_palindrome(), як у клітинці коду нижче.
def is_palindrome(this_str): rev_str="".join(reversed(this_str)) if (this_str == rev_str): return True else: return False
Ви також можете використовувати функцію is_palindrome() всередині розуміння списку, щоб зібрати всі паліндроми з довшого списку рядків.
str_list = ["refer","blue","level","12321","dragon"] palindromes = [string for string in str_list if is_palindrome(string)] print(palindromes) # Output ['refer', 'level', '12321']
Ось як працює наведений вище код:
- Пройдіть через str_list, викликайте is_palindrome() для кожного рядка.
- Якщо is_palindrome() повертає True, додайте рядок до списку паліндромів.
Як ви можете бачити у вихідних даних вище, palindromes — це список усіх паліндромних рядків у str_list.
Перевірте, чи є два рядки Python анаграмами
Ще одне популярне запитання, яке ви можете зустріти під час інтерв’ю, це перевірити, чи є пара рядків str1 і str2 анаграмами.
Два рядки називаються анаграмами, якщо кількість символів у двох рядках абсолютно однакова. Це означає, що ви можете отримати один із рядків, переставляючи або переставляючи символи в іншому рядку.
Приклади анаграм включають state-taste, save-vase, elbow-below тощо.
Як перевірити наявність анаграм за допомогою об’єкта лічильника в Python
Простим і інтуїтивно зрозумілим способом є обчислення кількості входжень кожного символу в двох рядках. А потім перевірте, чи рівні підрахунки.
Це можна зробити ще простіше за допомогою об’єкта Counter із модуля itertools. The Лічильник об’єкт повертає словник Python: із символами як ключами та відповідними підрахунками як значеннями.
Розглянемо рядки «save» і «vase», як показано нижче.
str1 = "save" str2 = "vase"
Тут c1 і c2 є об’єктами лічильників, що містять кількість символів рядків str1 і 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 повертає True, оскільки str1 і str2 є анаграмами.
Використовуючи цю логіку, тепер ми можемо продовжити і визначити функцію are_anagrams() з двома параметрами word1 і word2. У тілі функції ми перевіряємо, чи Counter(word1) == Counter(word2).
def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False
▶️ Щоб перевірити, викличте are_anagrams() із str1, str2 як аргументи. Оскільки str1 і str2 є анаграмами («save» і «vase»), функція повертає True, що є правильним.
are_anagrams(str1, str2) True
Як перевірити наявність анаграм за допомогою відсортованих копій рядків
Є інший спосіб зробити це.
Якщо два рядки є анаграмами, то їх відсортовані копії рівні.
Тому ми можемо переписати функцію are_anagrams(), щоб перевірити, чи збігається відсортована версія str1 з відсортованою копією str2. Якщо вони рівні, то два рядки є анаграмами; інакше вони не є.
Використовуючи наведений вище метод для перевірки рівності відсортованих копій, ми можемо переписати функцію are_anagrams() наступним чином.
def are_anagrams(word1, word2): if sorted(word1) == sorted(word2): return True else: return False
Давайте тепер зробимо кілька викликів функцій.
- Рядки «elbow» і «below» є анаграмами, а функція are_anagrams() повертає True.
- І «state» і «tasted» не є анаграмами, і функція повертає False.
are_anagrams("below","elbow") True are_anagrams("state","tasted") False
Перевірте, чи рядок Python має регістр заголовків
Ось наше останнє запитання для цього підручника.
Проблема. Дано рядок: ім’я людини — з ім’ям та прізвищем.
Ви повинні перевірити, чи перша буква імені та прізвища написана великою.
Цей тип регістру, коли перша літера кожного слова пишеться великою, називається регістром заголовка.
Тож вам потрібно перевірити, чи ім’я написано в регістрі:
1. Якщо так, виведіть повідомлення про те, що форматування в регістрі заголовка.
2. Інакше поверніть копію рядка, відформатованого в регістрі заголовка
- Python має вбудований метод string istitle(), який перевіряє, чи рядок міститься в регістрі заголовка.
- А рядковий метод Python title() повертає копію рядка, відформатованого в регістрі заголовка.
Отже, тепер ви можете використовувати ці два методи для вирішення проблеми.
Визначте функцію check_titlecase(), яка приймає назву як аргумент.
- Ви можете викликати метод istitle() для вхідного рядка, щоб перевірити, чи він відформатований у регістрі заголовка.
- Якщо True, ви можете надрукувати, що рядок уже в регістрі заголовка.
- Інакше ви можете викликати метод title() і повернути копію рядка в регістрі заголовка.
У наступній клітинці коду показано визначення функції check_titlecase().
def check_titlecase(name): if name.istitle(): print(f"'{name}' is already formatted in title case.") else: return name.title()
Давайте тепер викличемо метод check_titlecase() з аргументом.
check_titlecase("jane smith") # Output Jane Smith
У вихідних даних вище ви можете побачити, що рядок «Джейн Сміт» тепер у регістрі заголовка.
▶️ Візьмемо інший приклад.
check_titlecase("agatha Christie") # Output Agatha Christie
Цього разу давайте викличемо функцію за допомогою рядка в заголовку.
check_titlecase("Grace Hopper") # Output 'Grace Hopper' is already formatted in title case.
Ми отримуємо повідомлення, що рядок відформатовано в регістрі заголовка, і функція працює належним чином.
Висновок 👩🏫
Тепер давайте підсумуємо проблеми, які ми обговорювали досі.
- Щоб перевірити, чи рядок є паліндромом, перевірте, чи рядок і його перевернута версія рівні. Ви можете використовувати нарізку рядків або вбудовані методи, щоб перевернути рядки.
- Щоб перевірити, чи є два рядки анаграмами, перевірте, чи однакові їх відсортовані копії. А щоб відсортувати рядок, використовуйте вбудовану функцію sorted().
- Щоб перевірити, чи ім’я має регістр заголовка, використовуйте метод .istitle() для перевірки та метод .title(), щоб отримати копію рядка з регістром заголовка.
Сподіваюся, вам сподобався цей посібник із рядків Python. Як наступний крок дізнайтеся, як використовувати розуміння списків у Python, або дізнайтеся про оператор нерівності в Python.
Гарного навчання та програмування!🎉