Проверка строки на палиндром в Python

Обложка к статье "Проверка строк на палиндром в Python"

Задача на проверку строки на палиндром — довольно часто используется при проверки навыков программирования на Python. В этой статье мы рассмотрим несколько вариантов решения данной задачи. Но для начала начнём с определения.

Палиндром — это слово, фраза, число или любая другая последовательность символов, которая читается одинаково как в прямом, так и в обратном направлении. Примеры палиндромов включают слова, такие как «шалаш» и «довод». Так же палиндромом могут считаться и фразы, например «А роза упала на лапу Азора».

Перейдём к решению задачи, мы начнём с самых базовых способов и перейдём, к более продвинутым.

Использование цикла и условных операторов для проверки строки на палиндром в Python

Предположим, что наша строка будет содержать лишь одно слово, которое находится в одинаковом регистре (все буквы большие или маленькие). В этом случае мы можем использовать цикл и условные операторы, чтобы сравнить символы, начиная с крайних концов и двигаясь к середине.

Пример кода

# Данное слово для анализа
word = "довод"

# Инициализация индексов для проверки символов с обоих концов слова
left_index = 0
right_index = len(word) - 1

# Переменная для хранения результата проверки
is_palindrome = True

# Цикл для сравнения символов с обоих концов
while left_index < right_index:
    if word[left_index] != word[right_index]:
        is_palindrome = False
        break
    left_index += 1
    right_index -= 1

# Вывод результата
if is_palindrome:
    print(f"Слово '{word}' является палиндромом.")
else:
    print(f"Слово '{word}' не является палиндромом.")

Объяснение кода

  • В этом примере используется переменная word, содержащая слово для проверки.
  • Инициализируются два индекса: left_index и right_index, которые указывают на начальный и конечный символы слова соответственно. Первый символ имеет индекс 0, последний — длинна строки минус 1.
  • В цикле while символы слова сравниваются попарно с начала и конца, двигаясь к середине. Если в какой-то момент символы не совпадают, переменная is_palindrome устанавливается в False, и цикл прекращается.
  • После завершения цикла, в зависимости от значения переменной is_palindrome, выводится соответствующее сообщение о том, является ли слово палиндромом.

Игнорирование регистра и неалфавитных символов

Прежде чем перейти к другим способам решения задачи, мы должны немного усложнить задачу, и рассмотреть варианты, когда слово в строке будет начинаться с заглавной буквы или содержать предложение.

Чтобы не обращать внимание на регистр букв, мы можем вначале привести всю строку к одному регистру, например преобразовав все буквы в строке к нижнему регистру:

text = text.lower()

Если же нам необходимо проверить на палиндром целое предложение, то мы должны будем удалить все символы, кроме букв. Для этого мы можем выполнить следующее преобразование:

cleaned_text = ''.join(char for char in text if char.isalnum())
  • char for char in text if char.isalnum() является генераторным выражением, которое перебирает каждый символ char в исходной строке text.
  • char.isalnum() — это метод строк в Python, который проверяет, является ли символ алфавитно-цифровым (то есть либо буквой, либо цифрой). Если символ является алфавитно-цифровым, выражение char.isalnum() возвращает True, в противном случае — False.
  • Генераторное выражение char for char in text if char.isalnum() генерирует последовательность символов из text, которые являются алфавитно-цифровыми.
  • ''.join(...) — это метод, который принимает итерируемый объект (в данном случае, генераторное выражение) и объединяет его элементы в одну строку, используя между элементами строку, к которой применяется метод. В данном случае, перед элементами ничего не ставится (''), что означает простое слияние символов в одну строку без разделителей.

Применим полученные знания, и преобразуем наш код из предыдущего способа решения задачи:

# Данная строка для анализа
text = "А роза упала на лапу Азора"

# Преобразование строки для игнорирования регистра и неалфавитных символов
text_cleaned = ''.join(char.lower() for char in text if char.isalnum())

# Инициализация индексов для проверки символов с обоих концов строки
left_index = 0
right_index = len(text_cleaned) - 1

# Переменная для хранения результата проверки
is_palindrome = True

# Цикл для сравнения символов с обоих концов
while left_index < right_index:
    if text_cleaned[left_index] != text_cleaned[right_index]:
        is_palindrome = False
        break
    left_index += 1
    right_index -= 1

# Вывод результата
if is_palindrome:
    print("Строка является палиндромом.")
else:
    print("Строка не является палиндромом.")

Использование срезов строк для проверки строки на палиндром в Python

Решить задачу на проверку строки на палиндром в Python можно решить гораздо проще, используя срезы строк. Метод заключается в том, чтобы сравнить исходную строку с с новой строкой, которую мы создаём с помощью среза строк, беря все символы исходной строки в обратном порядке.

Пример кода

# Данная строка для анализа
text = "А роза упала на лапу Азора"

# Преобразование строки в нижний регистр и удаление пробелов и знаков пунктуации
text = text.lower()
text = ''.join(char for char in text if char.isalnum())

# Проверка, является ли строка палиндромом
is_palindrome = text == text[::-1]

# Вывод результата
if is_palindrome:
    print("Строка является палиндромом.")
else:
    print("Строка не является палиндромом.")

Объяснение кода

  • Сначала переменная text содержит исходную строку для анализа. В данном примере используется известный палиндром на русском языке.
  • Строка приводится к нижнему регистру методом .lower(), чтобы обеспечить регистронезависимость сравнения.
  • Из строки удаляются все неалфавитные символы с помощью генератора списка и метода .isalnum(). Это необходимо для корректной проверки на палиндром, поскольку пробелы, знаки пунктуации и другие специальные символы не должны учитываться.
  • Для проверки строки на палиндром используется сравнение исходной строки с её версией в обратном порядке (text[::-1]). Если строки идентичны, значит, исходная строка является палиндромом.
  • В зависимости от результата сравнения выводится соответствующее сообщение.

Для лучшего понимания, давайте подробнее разберём строку кода:

is_palindrome = word == word[::-1]

Срезы строк в Python

Срезы строк (string slicing) в Python позволяют извлекать подстроки из данной строки. Синтаксис среза выглядит следующим образом: строка[начало:конец:шаг], где:

  • начало — индекс, с которого начинается срез (включительно),
  • конец — индекс, на котором заканчивается срез (не включительно),
  • шаг — определяет шаг извлечения элементов.

Если шаг отрицательный, например -1, срез будет идти в обратном порядке.

Применение срезов для инверсии строки

В выражении word[::-1] используется срез с отрицательным шагом -1 без указания начала и конца среза. Это означает, что Python будет брать элементы строки word начиная с последнего и двигаясь к первому, тем самым создавая новую строку, которая является инверсией исходной.

Сравнение исходной строки и ее инверсии

word == word[::-1] сравнивает исходную строку word с ее инверсией word[::-1]. Если исходная строка и ее инверсия идентичны, это означает, что слово читается одинаково как слева направо, так и справа налево, следовательно, является палиндромом.

  • Если условие истинно, то выражение word == word[::-1] возвращает True, что присваивается переменной is_palindrome.
  • Если условие ложно, то есть строка и ее инверсия не совпадают, выражение возвращает False.

Пример

Для слова «довод»:

  • Исходная строка word: «довод»
  • Инверсия word[::-1]: «довод»

Так как «довод» == «довод», выражение возвращает True, подтверждая, что слово является палиндромом.

Оцените статью
( Пока оценок нет )
Обучение Python
Добавить комментарий