Напишите функцию is_palindrome
, которая принимает натуральное число, строку, кортеж или список, а возвращает логическое значение: True
— если передан палиндром, а в противном случае — False
.
Примечание
Ваше решение должно содержать только функции.
В решении не должно быть вызовов требуемых функций.
Для определения типа параметра можно воспользоваться функцией type
или более продвинутой isinstance
.
Пример
Ввод
result = is_palindrome(123)
Вывод
result = False
Ввод
result = is_palindrome([1, 2, 1, 2, 1])
Вывод
result = True
Решение
Довольно интересная задачка – подготовка к следующей теме. Уже знакомые нам алгоритмы определения палиндромов, под новым соусом – нам на вход могут дать число, строку или список. C каждым из этих типов мы уже умеем работать и определять является ли объект палиндромом. Таким образом, вся задача сводится к определению типа данных, которые мы получили в качестве входных данных и приведению их к универсальному виду, чтобы реализовывать меньше вариантов определения “палиндромности” объекта.
Давайте подумаем, каким образом мы можем определить является ли число палиндромом. С одной стороны, если число целое можно использовать алгоритм из задачи P. А роза упала на лапу Азора 2.0. С другой стороны, этот алгоритм не сработает с числом с плавающей запятой и придется его заметно модифицировать. Но, если, к примеру преобразовать число в строку, то можно использовать подход из E. А роза упала на лапу Азора 4.0.
Нам с вами еще не доводилось решать эту задачу с точки зрения списков, но так как и списки и строки объекты итерируемые, а принципы работы с итерируемыми объектами в python схожи, мы можем просто развернуть наш список срезом и проверить его на равенство самому себе до разворота. Фактически мы описали алгоритм решения из E. А роза упала на лапу Азора 4.0.
Таким образом, наша задача сводится к приведению любых числовых типов данных к строке с последующим сравнением результата с его развернутой копией.
Посмотреть код
Решение
def is_palindrome(test):
if isinstance(test, int) or isinstance(test, float):
test = str(abs(test))
return test == test[::-1]
Обрадовался пошёл переписывать для плавающей запятой.
в условиях задачи только натуральные числа)))
def is_palindrome(arg: str | int | tuple | list | float) -> bool:
“””А роза упала на лапу Азора 7.0″””
if isinstance(arg, tuple):
arg = str(arg[0])
if isinstance(arg, int | float):
arg = str(arg)
if arg == arg[::-1]:
return True
return False
не могу пройти 10 тест.
по условиям функция может принимать кортеж
ваш код не проходит данный тест
assert is_palindrome(tuple([-13231])) == False
Пока писал разобрался в своей ошибке.
Так и не научился создавать кортежи))
assert is_palindrome(-13231, ) == False
Правильный вариант.
Понял свою ошибку благодаря вашему коду.
Изначально приводил все типы к спискам.
def is_palindrome(arg: str | int | tuple | list) -> bool:
if isinstance(arg, int):
arg = str(arg)
return arg == arg[::-1]
В этой задаче есть философский момент – нужно ли отрицательное число брать по модулю или оставить как есть. Со строками все понятно – есть символ в начале строки, он должен быть в конце. С числами же все немного сложнее – если число отрицательное и его разобрать на составляющие, а затем собрать обратно, то оно останется отрицательным. Получается, что минус учитывать не нужно. Сами яндексы пояснить свою позицию по этому вопросу не смогли, но так как код срабатывает и с допущением минусов и без я привел вариант решения с игнорированием минуса.