Обратить строку Python, не опуская старт и конец
Как вы изменяете строку Python, не опуская аргументы начального и конечного срезов?
word = "hello"
reversed_word = word[::-1]
Я понимаю, что это работает, но как бы получить результат, указав начальные и конечные индексы?
word = "hello"
reversed_word = word[?:?:-1]
Трудно объяснить студентам, почему word[::-1]
меняет строку. Это лучше, если я могу дать им логические рассуждения, а не "это питонический путь".
Способ, которым я объясняю word[::1]
, выглядит следующим образом: "Вы не указали начало, чтобы оно начиналось с самого начала. Вы не указали конец, чтобы он просто доходил до конца. Теперь шаг 1, поэтому он просто идет от начала до конца 1 символ на 1." Теперь, когда мои ученики видят word[::-1]
, они собираются подумать: "Мы не указали начало или конец, чтобы оно проходило через строку -1 символов за раз?"
Ответы
Ответ 1
Из источника Python 2, это определяется с помощью тернарных выражений:
defstart = *step < 0 ? length-1 : 0;
defstop = *step < 0 ? -1 : length;
Итак, когда start и stop не заданы,
Если шаг отрицательный:
- начало - длина - 1
- stop - -1, (это индекс C, сложный для реализации на Python, должен быть -length-1)
Если шаг положительный:
Итак, чтобы ответить на этот вопрос:
Как получить результат, указав начальные и конечные индексы?
Чтобы указать это самостоятельно, используйте, например, следующее (помещено в функцию для повторного использования)
def my_slice(word, step):
'''slice word with only step'''
start = len(word)-1 if step < 0 else 0
stop = -len(word)-1 if step < 0 else len(word)
return word[start:stop:step]
word = "hello"
step = -1
my_slice(word, step)
возвращает
'olleh'
Ответ 2
Некоторые другие способы изменения строки:
word = "hello"
reversed_word1 = word[-1: :-1]
reversed_word2 = word[len(word)-1: :-1]
reversed_word3 = word[:-len(word)-1 :-1]
Одно примечание о нотации нотации a[i:j:k]
заключается в том, что опускание i
и j
не всегда означает, что i
станет 0
, а j
станет len(s)
. Это зависит от знака k
. По умолчанию k
- +1
.
- Если
k
равно + ve, то значением по умолчанию i
является 0
(начало с начала). Если это значение -ve, то значение по умолчанию i
равно -1
(начало с конца).
- Если
k
равно + ve, то значением по умолчанию j
является len(s)
(остановка в конце). Если это значение -ve, то значение по умолчанию j
равно -(len(s)+1)
(остановка в начале).
Теперь вы можете объяснить своим ученикам, как Hello[::-1]
печатает olleH
.
Ответ 3
Не совсем понятно, почему, но следующее вернет обратное значение word
:
word = "hello"
word[len(word):-(len(word)+1):-1]
Или...
word = "hello"
word[len(word):-len(word)-1:-1]
Изменить (Объяснение):
Из комментария jedward:
Средний параметр - самый сложный, но довольно простой как только вы осознаете (а) отрицательные индексы для начала/остановки среза что вы хотите считать "назад" от конца строки и (b) индекс остановки является эксклюзивным, поэтому он будет "считать" до, но останавливаться в/до индекса остановки. word [len (word): - len (word) -1: -1], вероятно, более ясно.
В ответ на этот комментарий:
Третье значение на самом деле является приращением, поэтому вы сообщаете Python, что вы хотите начать с последней буквы, затем верните все значения (-1) st до последнего.
Вот чертеж (затянутый в минуту):
![enter image description here]()
Рисунок показывает, что мы также можем использовать это:
word = "hello"
word[-1:-len(word)-1:-1] #-1 as the first
Ответ 4
Если вы не укажете число для нотации среза, Python будет использовать None
по умолчанию. Таким образом, вы можете просто написать значения None
:
>>> word = "hello"
>>> word[None:None:-1]
'olleh'
>>>
Ответ 5
In [27]: word
Out[27]: 'hello'
In [28]: word[-1:-6:-1]
Out[28]: 'olleh'
Почему это работает:
In [46]: word
Out[46]: 'hello'
In [47]: word[-1] # you want o to be your first value
Out[47]: 'o'
In [48]: word[-5] # you want h to be your last value
Out[48]: 'h'
In [49]: word[-1:-6:-1] # therefore ending point should be one
Out[49]: 'olleh' # past your last value that is -6
Ответ 6
Обозначение string[begin:end:increment]
может быть описано со следующей программой Python:
def myreverse( string, begin, end, increment ):
newstring = ""
if begin >= 0 and end < 0:
begin = -1
for i in xrange(begin, end, increment):
try:
newstring += string[i]
except IndexError:
pass
return newstring
Ответ 7
Рекурсивный подход:
def reverse(word):
if len(word) <= 1:
return word
return reverse(word[1:]) + word[0]