Не существует встроенной reverse
функции для str
объекта Python . Каков наилучший способ реализации этого метода?
Если вы даете очень краткий ответ, пожалуйста, уточните его эффективность. Например, str
преобразован ли объект в другой объект и т. Д.
Ответы:
Как насчет:
Это расширенный синтаксис слайса . Он работает, делая
[begin:end:step]
- оставляя начало и конец и указывая шаг -1, он переворачивает строку.источник
b = a.decode('utf8')[::-1].encode('utf8')
но спасибо за правильное направление!.decode('utf8')
требуется, это означает,a
что не содержит никаких строковых объектов, скорее байтов.@ Паоло самый
s[::-1]
быстрый; более медленный подход (может быть более удобным для чтения, но это спорный вопрос) есть''.join(reversed(s))
.источник
join
что в любом случае приходится составлять список, чтобы получить размер.''.join(list(reversed(s)))
может быть немного быстрееМой собственный опыт в этом вопросе академический. Однако, если вы профессионал, ищущий быстрый ответ, используйте фрагмент, который шаг за шагом
-1
:или более читабельно (но медленнее из-за поиска имени метода и того факта, что объединение формирует список при наличии итератора)
str.join
:или для удобства чтения и повторного использования поместите фрагмент в функцию
а потом:
Более длинное объяснение
Если вы заинтересованы в академической экспозиции, пожалуйста, продолжайте читать.
Вот пара вещей о строках Python, которые вы должны знать:
В Python строки неизменны . Изменение строки не изменяет строку. Это создает новый.
Строки срезаемые. Нарезка строки дает вам новую строку из одной точки в строке, назад или вперед, в другую точку с заданными приращениями. Они принимают обозначение среза или объект среза в нижнем индексе:
Подстрочный индекс создает срез путем включения двоеточия в фигурные скобки:
Чтобы создать срез вне фигурных скобок, вам нужно создать объект среза:
Читаемый подход:
Хотя
''.join(reversed('foo'))
он доступен для чтения, он требует вызова строкового методаstr.join
для другой вызываемой функции, что может быть довольно медленным. Давайте поместим это в функцию - мы вернемся к этому:Наиболее эффективный подход:
Гораздо быстрее использует обратный срез:
Но как мы можем сделать это более читаемым и понятным для кого-то, менее знакомого с кусочками или намерениями первоначального автора? Давайте создадим объект среза вне индексной записи, дадим ему описательное имя и передадим в индексную запись.
Реализовать как функцию
Чтобы на самом деле реализовать это как функцию, я думаю, что это достаточно семантически ясно, чтобы просто использовать описательное имя:
И использование просто:
Что, вероятно, хочет ваш учитель:
Если у вас есть инструктор, он, вероятно, хочет, чтобы вы начали с пустой строки и создали новую строку из старой. Вы можете сделать это с помощью чистого синтаксиса и литералов, используя цикл while:
Это теоретически плохо, потому что, помните, строки являются неизменяемыми - поэтому каждый раз, когда кажется, что вы добавляете символ к себе
new_string
, теоретически каждый раз создается новая строка! Тем не менее, CPython знает, как оптимизировать это в определенных случаях, одним из которых является этот тривиальный.Лучшая практика
Теоретически лучше собрать ваши подстроки в список и присоединиться к ним позже:
Однако, как мы увидим ниже, для CPython это на самом деле занимает больше времени, потому что CPython может оптимизировать конкатенацию строк.
Задержки
Вот время:
CPython оптимизирует конкатенацию строк, тогда как другие реализации не могут :
источник
while
и декремента индекса, хотя , возможно , это менее читаемыми:for i in range(len(a_string)-1, -1, -1):
. Больше всего мне нравится, что выбранная вами примерная строка - это тот случай, когда вам никогда не понадобится перевернуть ее, и вы не сможете сказать, что у васБыстрый ответ (TL; DR)
пример
Подробный ответ
Фон
Этот ответ предоставлен для решения следующих проблем @odigity:
проблема
Решение
Ловушки
string.reverse()
string.reverse()
чтобы избежать обозначения слайсов.print 'coup_ate_grouping'[-4:] ## => 'ping'
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
print 'coup_ate_grouping'[-1] ## => 'g'
[-1]
могут оттолкнуть некоторых разработчиковобоснование
У Python есть особое обстоятельство, о котором следует знать: строка является итеративным типом.
Одно из оснований для исключения
string.reverse()
метода состоит в том, чтобы дать разработчикам Python стимул использовать возможности этого особого обстоятельства.Говоря упрощенно, это просто означает, что с каждым отдельным символом в строке можно легко работать как часть последовательного расположения элементов, как массивы в других языках программирования.
Чтобы понять, как это работает, обзор example02 может дать хороший обзор.
Example02
Вывод
Когнитивный нагрузка , связанная с пониманием , как срез нотация работает в Python действительно может быть слишком много для некоторых усыновителей и разработчиков , которые не хотят инвестировать много времени в изучении языка.
Тем не менее, как только основные принципы будут поняты, сила этого подхода по сравнению с методами манипуляции с фиксированной струной может быть весьма благоприятной.
Для тех, кто думает иначе, существуют альтернативные подходы, такие как лямбда-функции, итераторы или простые одноразовые объявления функций.
При желании разработчик может реализовать свой собственный метод string.reverse (), однако полезно понять обоснование этого аспекта Python.
Смотрите также
источник
Существующие ответы верны только в том случае, если игнорируются модификаторы Unicode / кластеры графем. Я рассмотрю это позже, но сначала посмотрим на скорость некоторых алгоритмов разворота:
Вы можете видеть, что время для понимания списка (
reversed = string[::-1]
) во всех случаях намного меньше (даже после исправления моей опечатки).Обращение строки
Если вы действительно хотите перевернуть строку в обычном смысле этого слова, это НАМНОГО сложнее. Например, возьмите следующую строку ( коричневый палец, указывающий влево , желтый палец, указывающий вверх ). Это две графемы, но 3 юникодных кода. Дополнительный модификатор скина .
Но если вы измените его любым из указанных способов, вы получите коричневый палец, указывающий вверх , желтый палец, указывающий влево . Причина этого заключается в том, что «коричневый» модификатор цвета все еще находится в середине и применяется ко всему, что находится до него. Итак, мы имеем
а также
Графические кластеры Unicode немного сложнее, чем просто кодовые точки модификаторов. К счастью, есть библиотека для обработки графем :
и, следовательно, правильный ответ будет
который также является самым медленным:
Код
источник
1. используя обозначение среза
2. используя функцию reversed ()
3. с помощью рекурсии
источник
RecursionError: maximum recursion depth exceeded while calling a Python object
. Пример:rev_string("abcdef"*1000)
Менее озадачивающий способ посмотреть на это будет:
На английском языке [-1 :: - 1] читается как:
источник
-1
не менее, все еще не требуется.Обратная строка в Python без использования reversed () или [:: - 1]
источник
Это тоже интересный способ:
или похожие:
Еще один «экзотический» способ с использованием byterarray, который поддерживает .reverse ()
будет производить:
источник
источник
источник
Это работает путем циклического перебора строки и присвоения ее значений в обратном порядке другой строке.
источник
Здесь нет ничего необычного:
источник
Вот один без
[::-1]
илиreversed
(для учебных целей):Вы можете использовать
+=
для объединения строк, ноjoin()
это быстрее.источник
Рекурсивный метод:
пример:
источник
Все вышеперечисленные решения идеальны, но если мы попытаемся перевернуть строку, используя цикл for в python, это будет немного сложнее, поэтому вот как мы можем перевернуть строку, используя цикл for
Я надеюсь, что это будет полезно для кого-то.
источник
Это мой путь:
источник
Есть много способов перевернуть строку, но я также создал другую просто для удовольствия. Я думаю, что такой подход не так уж и плох.
источник
Этот класс использует магические функции Python для обращения строки:
Вывод
Ссылка
источник
Чтобы решить это программным способом для интервью
Вывод:
источник
В Python 3 вы можете перевернуть строку на месте, что означает, что она не будет присвоена другой переменной. Сначала вы должны преобразовать строку в список, а затем использовать
reverse()
функцию.https://docs.python.org/3/tutorial/datastructures.html
источник
Это простая и значимая обратная функция, легкая для понимания и кодирования.
источник
Вот просто:
печать "loremipsum" [- 1 :: - 1]
а некоторые по логике:
вывод:
muspimerol
источник
Переверните строку без магии питона.
источник
Конечно, в Python вы можете делать очень интересные вещи в 1 строку. :)
Вот простое, универсальное решение, которое может работать на любом языке программирования.
источник
ВЫВОД :
источник
Вы можете использовать обратную функцию со списком. Но я не понимаю, почему этот метод был исключен в Python 3, был излишне.
источник
.join
или что-то, чтобы сделать правильный ответ[c for c in string]
это равнозначноlist(string)
.