Програми Python для операцій із рядками

У цьому посібнику ви будете писати програми 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 за допомогою нарізки

Синтаксис [start: stop: step] повертає фрагмент рядка від початку до, але не включаючи зупинку, з кроком розміру кроку.

  • Якщо опустити початок, фрагмент починається на початку рядка.
  • Якщо ви не вкажете індекс зупинки, зріз продовжуватиметься до кінця рядка.
  • А від’ємні значення кроку можна використовувати для повернення фрагментів, починаючи з кінця рядка.
  Виправте неочікувану помилку на Netflix

Отже, [::-1] повертає перевернуту копію рядка.

Наступна клітинка коду містить визначення функції 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 анаграмами.

Два рядки називаються анаграмами, якщо кількість символів у двох рядках абсолютно однакова. Це означає, що ви можете отримати один із рядків, переставляючи або переставляючи символи в іншому рядку.

  Чому мікропрограмне забезпечення UEFI вашого комп’ютера потребує оновлення безпеки

Приклади анаграм включають 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 має регістр заголовків

Ось наше останнє запитання для цього підручника.

Проблема. Дано рядок: ім’я людини — з ім’ям та прізвищем.

  Як зарядити комутатор Nintendo без док-станції

Ви повинні перевірити, чи перша буква імені та прізвища написана великою.

Цей тип регістру, коли перша літера кожного слова пишеться великою, називається регістром заголовка.

Тож вам потрібно перевірити, чи ім’я написано в регістрі:

1. Якщо так, виведіть повідомлення про те, що форматування в регістрі заголовка.

2. Інакше поверніть копію рядка, відформатованого в регістрі заголовка

  • Python має вбудований метод string istitle(), який перевіряє, чи рядок міститься в регістрі заголовка.

.istitle() повертає True, якщо рядок відформатовано в регістрі заголовка, інакше повертає False.

  • А рядковий метод 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.

Гарного навчання та програмування!🎉