Задействовать упражнение с жадным кодексом (питон)

Мне нужно перевернуть строку без использования функции обратного или [::-1].

Мой код до сих пор:

def reverse(text):
        if len(text) == 1:
        return text
    else:
        x= []
        y= ""
        for i in xrange(len(text)-1, -1, -1):
            x[len(text) - i] = text[i]
        for i in xrange(0,len(x)):
            y[i] = x[i]
        return y

Я получаю сообщение об ошибке "Индекс назначения списка вне диапазона", хотя я не уверен, почему я получаю это. Спасибо за любую помощь.

2 ответа

Ваша логика обратного диапазона верна, начните диапазон в конце строкового индекса и начните обратный отсчет до 0, вам просто нужно использовать его в списке comp и использовать join:

def reverse(text):
        # catch empty and strings of one char
        if len(text) < 2:
            return text
        # start at index of last char and decrease
        return "".join([text[i] for i in xrange(len(text)-1,-1,-1)])

Вы не можете назначить строку y[i] = x[i], если вы хотите сделать это, вам нужно будет сделать y список и использовать снова использовать объединение.

Ваша ошибка индекса, потому что вы пытаетесь проиндексировать и очистить список, вы должны добавить x:

    for i in range(len(text)-1, -1, -1):
            x.append(text[i])

Это было бы как сделать это с вашим собственным кодом, хотя я бы предпочел просто использовать join:

def reverse(text):
    if len(text) < 2:
       return text
    else:
        x= []
        y= ""
        for i in range(len(text)-1, -1, -1):
            x.append(text[i]) # append 
        for i in x: # iterate over x
            y += i # concatenate
        return y 

Какой с помощью соединения будет:

def reverse(text):
    if len(text) < 2:
       return text
    else:
        x= []
        for i in range(len(text)-1, -1, -1):
            x.append(text[i])
        return "".join(x)

Вы делаете много прикольных вещей, в том числе пытаетесь присвоить списку более высокий индекс и предполагаете, что он "заполнит пробелы" как бы.

In [1]: x = []

In [2]: x[4] = 1

# what you want to happen:
# x = [None, None, None, None, 1]

# what actually happens:
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-a9f6d07b2ba4> in <module>()
----> 1 x[4] = 1

IndexError: list assignment index out of range

Так что давайте вместо этого воспользуемся другим подходом. Что вы действительно хотите сделать, так это взять все символы строки и расположить их в обратном порядке. Ну списки есть pop метод, который удаляет и возвращает последний элемент, и append элемент, который добавляет в конец. Это звучит примерно так. К счастью, также очень легко превратить строку в список!

In [3]: s = "abcd"

In [4]: list(s)
Out[4]: ['a', 'b', 'c', 'd']

Теперь давайте повторим, popи appendпо ходу дела, один раз за элемент в новом списке.

In [5]: def new_reverse(s):
   ...:     in_ = list(s)
   ...:     out = []
   ...:     for _ in range(len(in_)):
   ...:         ch = in_.pop()
   ...:         out.append(s)
   ...:     return out
   ...:

In [6]: new_reverse("abcd")
Out[6]: ['d','c','b','a']

Что ж, теперь мы превратили нашу строку в перевернутый список. Это сложная часть, потому что объединение списков обратно в строки действительно элементарно. str имеет join метод, который принимает итеративный и объединяет все элементы с str называя это, например

'|'.join(['a','b','c','d']) --> 'a|b|c|d'
'/'.join(['', 'usr', 'bin']) --> '/usr/bin'

Если вы используете пустую строку, '', это должно все слиться как обычно.

In [12]: def new_reverse(s):
   ...:     in_ = list(s)
   ...:     out = []
   ...:     for _ in range(len(in_)):
   ...:         ch = in_.pop()
   ...:         out.append(s)
   ...:     return ''.join(out)
   ...:

In [13]: new_reverse('abcd')
Out[13]: 'dcba'
Другие вопросы по тегам