Как перевернуть строку в Python

Обратная строка Python

В Python строка — это последовательность символов Unicode. Хотя Python поддерживает множество функций для работы со строками, в нём нет встроенной функции или метода, специально предназначенного для переворачивания строки.

 >>> 'Linuxize' .reverse ()
 Traceback (most recent call last): File "", line 1, in  AttributeError: 'str' object has no attribute 'reverse'

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

В этой статье рассматриваются несколько способов перевернуть строку в Python.

Использование нарезки

Понимание принципов работы индексации в Python крайне важно для выполнения операции «String Slice». Обычно индексы используются для доступа к определённым символам в строке.

Существует два типа индексации: положительная и отрицательная индексация.

Использование нарезки

Доступ к символу n можно получить либо через положительный индекс 2 , либо через отрицательный индекс -6 :

 >>> print ( 'Linuxize' [ 2 ])
 n
 >>> print ( 'Linuxize' [ -6 ])
 n

Мы можем извлечь диапазон символов из строки с помощью метода среза. Срез — это операция, которая извлекает последовательность подстроки из заданной строки.

Синтаксис среза:

 string [ start : stop : step ]
  • Первый аргумент указывает индекс, с которого начинается извлечение. Отрицательный индекс указывает смещение от конца строки. Если этот аргумент опущен, срез начинается с индекса 0.
  • Второй аргумент указывает индекс, до которого следует завершить извлечение; результат не включает элемент stop . Отрицательный индекс указывает смещение от конца строки. Если этот аргумент опущен или превышает длину строки, срез выполняется до конца строки.
  • Третий аргумент необязателен и задаёт шаг среза. Если аргумент step не указан, он по умолчанию равен 1. При использовании отрицательного значения элементы среза выбираются в обратном порядке.

Результатом нарезки строки является новая строка, содержащая извлеченные элементы, при этом исходная строка не изменяется.

Чтобы перевернуть строку с помощью нарезки, опустите аргументы start и stop и используйте отрицательное приращение шага -1 .

Отрицательное приращение шага -1 означает, что нарезка начинается с последнего элемента и заканчивается на первом, в результате чего получается перевернутая строка.

 >>> print ( 'Linuxize' [ ::-1 ])
 ezixuniL

Вы также можете определить пользовательскую функцию и использовать ее для переворачивания строк:

 def rev_str_thru_slicing ( str_ ): return str_ [:: - 1 ] INPUT_STRING = "Linuxize" if __name__ == '__main__' : print ( "INPUT STRING -" , INPUT_STRING ) print ( "REVERSED STRING -" , rev_str_thru_slicing ( INPUT_STRING ))
 Input String - Linuxize Reversed String using Slicing - ezixuniL

Использование функции reversed()

Встроенная функция reserved() обрабатывает элементы строки в обратном порядке и возвращает обратный итератор.

В приведенном ниже примере элементы обратного итератора добавляются в пустую строку с помощью оператора join() :

 def rev_str_thru_join_revd ( STR ): return "" . join ( reversed ( STR )) INPUT_STRING = "Linuxize" if __name__ == '__main__' : print ( "INPUT STRING -" , INPUT_STRING ) print ( "RESERVED STRING THROUGH JOIN & REVERSED" , rev_str_thru_join_revd ( INPUT_STRING ))
 Input String - Linuxize Reserved String Through Join & Reserved Methods - ezixuniL

Использование списка reverse()

Чтобы перевернуть строку с помощью метода списка reverse() , сначала необходимо преобразовать строку в список с помощью конструктора list . Затем элементы списка переворачиваются на месте с помощью метода reverse() , а затем элементы списка объединяются в строку с помощью метода join() .

Вот пример:

 def rev_str_thru_list_reverse ( STR ): lst = list ( STR ) lst . reverse () return ( '' . join ( lst ))  INPUT_STRING = "Linuxize"  if __name__ == '__main__' : print ( "Input String -" , INPUT_STRING ) print ( "Reserved String Through List" , rev_str_thru_list_reverse ( INPUT_STRING ))
 Input String - Linuxize Reserved String Through List Reverse Method - ezixuniL

Использование рекурсивной функции

В Python рекурсивная функция — это функция, которая вызывает сама себя до тех пор, пока не будет выполнено некоторое условие.

В приведённом ниже фрагменте кода функция rev_str_thru_recursion вызывает себя до тех пор, пока длина строки не станет больше нуля. При каждом вызове строка разрезается, оставляя только первый символ. Затем она объединяется с отрезанными символами.

 def rev_str_thru_recursion ( STR ): if len ( STR ) == 0 : return STR else : return rev_str_thru_recursion ( STR [ 1 :]) + STR [ 0 ] INPUT_STRING = "Linuxize" if __name__ == '__main__' : print ( "INPUT STRING -" , INPUT_STRING ) print ( "RESERVED STRING THROUGH RECURSION" , rev_str_thru_recursion ( INPUT_STRING ))

Сравнительный анализ

В этом разделе мы проведём простое сравнение этих четырёх определённых методов для определения их эффективности. Мы проанализируем производительность с помощью модуля Python «timeit». Он показывает время выполнения фрагментов кода. Параметр «repeat» модуля «timeit» позволяет повторить выполнение кода миллион раз. Результат можно представить как среднее время выполнения фрагмента кода миллион раз.

Методы Время выполнения Расчет коэффициента сравнения.
Нарезка 0,23 1x
Список Обратный 1.63 7x
Присоединиться и зарезервировать 1.73 7,5x
Рекурсия 19.19 83x

Таблица выше показывает, что метод среза в семь раз быстрее метода обратного списка, в 7,5 раз быстрее метода объединения и резервирования и в 83 раза быстрее метода рекурсии. Таким образом, срез — самый быстрый и лучший способ перевернуть строку.

Сравнительный анализ

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

 if __name__ == "__main__" : ## Performance Calculation import timeit from statistics import mean s = INPUT_STRING * 10 repeatCount = 100 SLICING_PERF = timeit . repeat ( lambda : rev_str_thru_slicing ( s ), repeat = repeatCount ) print ( min ( SLICING_PERF ), mean ( SLICING_PERF ), max ( SLICING_PERF ), SLICING_PERF ) J_R_PERF = timeit . repeat ( lambda : rev_str_thru_join_revd ( s ), repeat = repeatCount ) print ( min ( J_R_PERF ), mean ( J_R_PERF ), max ( J_R_PERF ), J_R_PERF ) LIST_PERF = timeit . repeat ( lambda : rev_str_thru_list_reverse ( s ), repeat = repeatCount ) print ( min ( LIST_PERF ), mean ( LIST_PERF ), max ( LIST_PERF ), LIST_PERF ) RECUR_PERF = timeit . repeat ( lambda : rev_str_thru_recursion ( s ), repeat = repeatCount ) print ( min ( RECUR_PERF ), mean ( RECUR_PERF ), max ( RECUR_PERF ), RECUR_PERF )

Заключение

В Python нет встроенных функций для переворота строки, но мы можем использовать другие методы. Регрессионный анализ показал, что метод срезов — самый быстрый способ перевернуть строку.

питон

Об авторах

Шрирам Рамануджам

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

Связанные руководства

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *