Задействовать упражнение с жадным кодексом (питон)
Мне нужно перевернуть строку без использования функции обратного или [::-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'