Подтвердить что ты не робот

Обратить строку Python, не опуская старт и конец

Как вы изменяете строку Python, не опуская аргументы начального и конечного срезов?

word = "hello"
reversed_word = word[::-1]

Я понимаю, что это работает, но как бы получить результат, указав начальные и конечные индексы?

word = "hello"
reversed_word = word[?:?:-1]

Трудно объяснить студентам, почему word[::-1] меняет строку. Это лучше, если я могу дать им логические рассуждения, а не "это питонический путь".

Способ, которым я объясняю word[::1], выглядит следующим образом: "Вы не указали начало, чтобы оно начиналось с самого начала. Вы не указали конец, чтобы он просто доходил до конца. Теперь шаг 1, поэтому он просто идет от начала до конца 1 символ на 1." Теперь, когда мои ученики видят word[::-1], они собираются подумать: "Мы не указали начало или конец, чтобы оно проходило через строку -1 символов за раз?"

4b9b3361

Ответ 1

Из источника Python 2, это определяется с помощью тернарных выражений:

defstart = *step < 0 ? length-1 : 0;
defstop = *step < 0 ? -1 : length;

Итак, когда start и stop не заданы,

Если шаг отрицательный:

  • начало - длина - 1
  • stop - -1, (это индекс C, сложный для реализации на Python, должен быть -length-1)

Если шаг положительный:

  • start = 0
  • stop - длина

Итак, чтобы ответить на этот вопрос:

Как получить результат, указав начальные и конечные индексы?

Чтобы указать это самостоятельно, используйте, например, следующее (помещено в функцию для повторного использования)

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]