Шаг 89.
Однострочники Python.
Алгоритмы. Поиск палиндромов с помощью лямбда-функций и негативных срезов

    На этом шаге мы рассмотрим еще один термин computer science, часто встречающийся в вопросах на собеседованиях: палиндромы. Мы проверим с помощью однострочника, являются ли два слова палиндромами друг друга.

Общее описание

    Для начала: что такое палиндром? Палиндром - это последовательность элементов (например, строка или список), которая читается одинаково от начала к концу и наоборот. Рассмотрим несколько забавных примеров палиндромов (без учета пробелов).

    Наше однострочное решение потребует некоторых знаний о срезах. Как вы уже знаете, срезы в Python означают "вырезание" диапазона значений из различных типов последовательностей, например строк или списков. Для среза, начинающегося с индекса начало (включая его) и заканчивающего на индексе конец (исключая его), используется очень лаконичная нотация [начало:конец:шаг]. Третий параметр шаг позволяет задавать размер шага - количество элементов исходной последовательности, пропускаемых перед следующим элементом среза (например, шаг=2 означает, что срез будет включать только каждый второй элемент). При отрицательном размере шага последовательность обходится в обратном порядке.

    Вот и все, что нужно знать для создания простого и лаконичного однострочного решения на Python.

Код

    Наш код должен определять, совпадают ли символы заданной строки символов в обратном порядке с исходной строкой, то есть определять, является ли эта строка палиндромом.


Пример 6.2. Однострочное решение, проверяющее, является ли строковое значение палиндромом
## Однострочник
is_palindrome = lambda phrase: phrase == phrase[::-1]

## Результат
print(is_palindrome("anna"))
print(is_palindrome("kdljfasjf"))
print(is_palindrome("rats live on no evil star"))
Архив с файлом можно взять здесь.

Принцип работы

    Наше простое однострочное решение не требует для работы никаких внешних библиотек. Мы описываем лямбда-функцию, которая принимает один аргумент phrase - проверяемую строку символов - и возвращает булево значение, указывающее, остается ли последовательность символов такой же в обратном порядке. Для получения строки символов в обратном порядке мы используем срез.

    Результаты этого фрагмента кода выглядят следующим образом:

## Результат
print(is_palindrome("anna")) # True
print(is_palindrome("kdljfasjf")) # False
print(is_palindrome("rats live on no evil star")) # True

    Первая и третья строки символов - палиндромы, а вторая - нет. Далее мы займемся еще одним популярным в computer science понятием: перестановками.

    На следующем шаге мы рассмотрим подсчет количества перестановок с помощью рекурсивных функций вычисления факториалов.




Предыдущий шаг Содержание Следующий шаг